Вы можете пойти дальше:
merge(Xs, Ys) -> lists:reverse(merge1(Xs, Ys, [])).
merge1([], [], Zs) -> Zs.
merge1([X | Xs], [Y | Ys], Zs) -> merge1(Xs, Ys, [X, Y | Zs]).
Это имеет значительное преимущество по сравнению с предложением feonixrift, что вы не переключаете порядок параметров (что нарушает принцип наименьшего удивления).
Хорошей практикой также является присвоение вспомогательной функции (в данном случае merge1) другого имени, так как это легче обнаружить при изменении арности. Это особенно верно, если, например, merge / 2 не экспортируется, а merge1 / 3 нет. Это в основном говорит: «Я просто помощник, не называй меня прямым!»
Также удобно сначала написать желаемое предложение-терминатор, поскольку это делает природу рекурсии явной - как только вы прочитаете определение функции, этот fn завершается при исчерпании списка.