У тебя почти было это. Вы получаете ошибку выхода за границы, потому что в вашем цикле while вы проверяете индексы a и b ПОСЛЕ того, как вы уже увеличили значение i.
С некоторыми незначительными изменениями вы, в основном, получили его.
Вот ваш способ немного подправлен:
l1=[1,2,3,4]
l2=[1,2,4]
def foo(a, b):
i = 0
while i < min(len(a), len(b)):
if a[i] < b[i]:
return a
if a[i] > b[i]:
return b
i+=1
print(foo(l1, l2))
Напечатает
[1,2,3,4]
Примечание ... вы должны рассмотреть случай, когда l1 = [1,2,3,4] и l2 = [1,2,3]. Что вы на самом деле хотите вернуть? Если мы будем придерживаться вашего оператора else, то l2 (или b) вернется. С моим твиком это вернет None.