Merge two collections by interleaving values

Another way:

List(List(1,2), List(3,4)).transpose.flatten

So maybe your collections aren't always the same size. Using zip in that situation would create data loss.

def interleave[A](a :Seq[A], b :Seq[A]) :Seq[A] =
  if (a.isEmpty) b else if (b.isEmpty) a
  else a.head +: b.head +: interleave(a.tail, b.tail)

interleave(List(1, 2, 17, 27)
          ,Vector(3, 4))  //res0: Seq[Int] = List(1, 3, 2, 4, 17, 27)

Try

List(1,2)
  .zip(List(3,4))
  .flatMap(v => List(v._1, v._2))

which outputs

res0: List[Int] = List(1, 3, 2, 4)

Also consider the following implicit class

implicit class ListIntercalate[T](lhs: List[T]) {
  def intercalate(rhs: List[T]): List[T] = lhs match {
    case head :: tail => head :: (rhs.intercalate(tail))
    case _ => rhs
  }
}

List(1,2) intercalate List(3,4)
List(1,2,5,6,6,7,8,0) intercalate List(3,4)

which outputs

res2: List[Int] = List(1, 3, 2, 4)
res3: List[Int] = List(1, 3, 2, 4, 5, 6, 6, 7, 8, 0)