Как реализовать слияние двух списков через цикл while с разной длиной списков?
Что проверяют
Аккуратность на границах: условие цикла и дописывание хвоста, когда списки разной длины. Заодно смотрят, уточните ли вы, что вообще значит «слить» в этой задаче.
Как отвечать
Первый вопрос интервьюеру: списки упорядочены и нужен упорядоченный результат, или их надо чередовать. Решения разные.
Слияние упорядоченных списков:
def merge(a, b):
res = []
i = j = 0
while i < len(a) and j < len(b):
if a[i] <= b[j]:
res.append(a[i]); i += 1
else:
res.append(b[j]); j += 1
res.extend(a[i:])
res.extend(b[j:])
return resКлючевая деталь именно про разную длину: основной цикл идёт по and и завершается, как только кончился более короткий список, а остаток длинного дописывается после цикла срезом. Срез безопасен при любом индексе: a[5:] при len(a) == 3 вернёт пустой список, а не ошибку, поэтому один и тот же код работает для обоих направлений.
Условие or в основном цикле выглядит соблазнительно, но тогда внутри нужны проверки «этот список ещё не кончился» на каждом обращении, иначе IndexError. Два хвостовых extend читаются лучше.
Чередование, если порядок не важен:
from itertools import zip_longest
_MISSING = object()
res = [x for pair in zip_longest(a, b, fillvalue=_MISSING)
for x in pair if x is not _MISSING]zip обрезал бы результат по длине короткого списка, поэтому zip_longest. Сентинел вместо None нужен, если None может встречаться в самих данных.
Сложность обоих вариантов O(n+m) по времени, память O(n+m) под результат.
Для многих источников или для данных, которые не помещаются в память, есть heapq.merge: ленивый итератор, поддерживает key и reverse, сложность O(N log k) по числу источников.
Крайние случаи для проверки: оба списка пустые, один пустой, все элементы равны, разница длин на порядок.
Где спотыкаются
Ставят or в условии while без проверок индексов внутри и ловят IndexError, либо забывают хвостовые extend и молча теряют конец более длинного списка.