← Назад к вопросам

Слияние отсортированных списков

1.7 Middle🔥 171 комментариев
#Теория тестирования

Условие

Напишите функцию на Python, которая объединяет два отсортированных списка в один отсортированный список.

Пример

Вход: [1, 3, 5], [2, 4, 6] Выход: [1, 2, 3, 4, 5, 6]

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Задача требует объединения двух отсортированных списков в один отсортированный результат. Это классическая задача, которая часто встречается на собеседованиях и тесно связана с алгоритмом merge из сортировки MergeSort.

Подход с двумя указателями (Two-Pointer Technique)

Оптимальное решение использует технику двух указателей с временной сложностью O(n + m), где n и m — длины списков. Идея проста: проходим оба списка одновременно, сравниваем элементы и добавляем меньший в результат.

def merge_sorted_lists(list1: list[int], list2: list[int]) -> list[int]:
    """
    Объединяет два отсортированных списка в один отсортированный список.
    
    Args:
        list1: Первый отсортированный список
        list2: Второй отсортированный список
    
    Returns:
        Объединённый отсортированный список
    
    Time Complexity: O(n + m)
    Space Complexity: O(n + m)
    """
    result = []
    i, j = 0, 0
    
    # Проходим оба списка, сравнивая элементы
    while i < len(list1) and j < len(list2):
        if list1[i] <= list2[j]:
            result.append(list1[i])
            i += 1
        else:
            result.append(list2[j])
            j += 1
    
    # Добавляем оставшиеся элементы из первого списка
    result.extend(list1[i:])
    
    # Добавляем оставшиеся элементы из второго списка
    result.extend(list2[j:])
    
    return result

Примеры использования

# Базовый пример
list1 = [1, 3, 5]
list2 = [2, 4, 6]
print(merge_sorted_lists(list1, list2))  # [1, 2, 3, 4, 5, 6]

# Списки разной длины
list1 = [1, 2, 5]
list2 = [3, 4, 6, 7, 8]
print(merge_sorted_lists(list1, list2))  # [1, 2, 3, 4, 5, 6, 7, 8]

# Один список длиннее
list1 = [1, 10]
list2 = [2, 3, 4, 5]
print(merge_sorted_lists(list1, list2))  # [1, 2, 3, 4, 5, 10]

# Пустые списки
list1 = []
list2 = [1, 2, 3]
print(merge_sorted_lists(list1, list2))  # [1, 2, 3]

Альтернативные подходы

Простой способ (не оптимальный):

def merge_sorted_lists_simple(list1: list[int], list2: list[int]) -> list[int]:
    return sorted(list1 + list2)  # O(n log n)

Этот способ работает, но менее эффективен — O(n log n) вместо O(n + m).

Ключевые характеристики решения

  • Временная сложность: O(n + m) — каждый элемент посещается ровно один раз
  • Пространственная сложность: O(n + m) — для хранения результата
  • Стабильность: Сохраняет относительный порядок элементов
  • Надёжность: Работает с пустыми списками, списками разной длины, дубликатами

Это решение идеально подходит для QA автоматизации, так как демонстрирует понимание алгоритмов и умение писать эффективный, читаемый код.