Ошибка: после выхода из цикла остаются необработанные хвосты одного из списков — функция возвращает только объединённую часть до первого опустошения, пропуская оставшиеся элементы. Пример проявления: для a=[1,3]a=[1,3]a=[1,3], b=[2,4,5]b=[2,4,5]b=[2,4,5] код вернёт [1,2,3][1,2,3][1,2,3] вместо правильного [1,2,3,4,5][1,2,3,4,5][1,2,3,4,5]. Исправление (добавить добавление оставшихся элементов; опционально использовать ≤\le≤ для сохранения устойчивости при равенстве): def merge(a, b): i = j = 0 res = [] while i < len(a) and j < len(b): if a[i] <= b[j]: # или if a[i] < b[j]: в зависимости от желаемого поведения при равенстве res.append(a[i]); i += 1 else: res.append(b[j]); j += 1 if i < len(a): res.extend(a[i:]) if j < len(b): res.extend(b[j:]) return res Оценка сложности: по времени O(len(a)+len(b))\mathcal{O}(len(a)+len(b))O(len(a)+len(b)), по дополнительной памяти (результат) O(len(a)+len(b))\mathcal{O}(len(a)+len(b))O(len(a)+len(b)).
Пример проявления: для a=[1,3]a=[1,3]a=[1,3], b=[2,4,5]b=[2,4,5]b=[2,4,5] код вернёт [1,2,3][1,2,3][1,2,3] вместо правильного [1,2,3,4,5][1,2,3,4,5][1,2,3,4,5].
Исправление (добавить добавление оставшихся элементов; опционально использовать ≤\le≤ для сохранения устойчивости при равенстве):
def merge(a, b):
i = j = 0
res = []
while i < len(a) and j < len(b):
if a[i] <= b[j]: # или if a[i] < b[j]: в зависимости от желаемого поведения при равенстве
res.append(a[i]); i += 1
else:
res.append(b[j]); j += 1
if i < len(a):
res.extend(a[i:])
if j < len(b):
res.extend(b[j:])
return res
Оценка сложности: по времени O(len(a)+len(b))\mathcal{O}(len(a)+len(b))O(len(a)+len(b)), по дополнительной памяти (результат) O(len(a)+len(b))\mathcal{O}(len(a)+len(b))O(len(a)+len(b)).