Программа курса:

1.1 - Часть 1 1.2 - Часть 2 1.3 - Часть 3 1.4 - Часть 4 1.5 - Часть 5 1.6 - Часть 6 1.7 - Часть 7 1.8 - Часть 8 1.9 - Часть 9 1.10 - Часть 10 1.11 - Часть 11 1.12 - Часть 12
2.1 - Часть 1 2.2 - Часть 2 2.3 - Часть 3 2.4 - Часть 4 2.5 - Часть 5 2.6 - Часть 6
3.1 - Часть 1

Разбор задачи: Объединение двух отсортированных списков

Предложенный нами код решения:

def merge_two_lists(list1, list2):
    # Инициализируем пустой список для результата
    merged_list = []

    # Указатели на текущие индексы в list1 и list2
    i, j = 0, 0

    # Проходим по обоим спискам, пока не достигнем конца хотя бы одного
    while i < len(list1) and j < len(list2):
        if list1[i] <= list2[j]:
            merged_list.append(list1[i])
            i += 1
        else:
            merged_list.append(list2[j])
            j += 1

    # Добавляем оставшиеся элементы из list1 или list2
    merged_list.extend(list1[i:])
    merged_list.extend(list2[j:])

    return merged_list

1. Инициализация пустого списка результата

merged_list = []

Мы создаём пустой список merged_list, куда будем последовательно добавлять элементы из обоих входных списков в отсортированном порядке.


2. Инициализация указателей

i, j = 0, 0

Указатели i и j используются для отслеживания текущей позиции в списках list1 и list2. Они начинаются с 0, так как мы стартуем с начала каждого списка.


3. Основной цикл: слияние списков

while i < len(list1) and j < len(list2):
    if list1[i] <= list2[j]:
        merged_list.append(list1[i])
        i += 1
    else:
        merged_list.append(list2[j])
        j += 1
  • Условие while: Цикл продолжается до тех пор, пока оба указателя i и j находятся внутри границ соответствующих списков. Это означает, что у нас есть элементы в обоих списках для сравнения.
  • Сравнение элементов:
    • Если текущий элемент из list1 меньше или равен текущему элементу из list2, то этот элемент добавляется в merged_list, и указатель i увеличивается на 1.
    • Иначе добавляется элемент из list2, и указатель j увеличивается на 1.

Таким образом, мы всегда добавляем минимальный из текущих элементов двух списков.


4. Добавление оставшихся элементов

merged_list.extend(list1[i:])
merged_list.extend(list2[j:])

После завершения цикла while, один из списков может быть полностью обработан, а в другом могут остаться элементы. Эти строки добавляют все оставшиеся элементы в merged_list:

  • list1[i:] — оставшиеся элементы из list1, начиная с позиции i.
  • list2[j:] — оставшиеся элементы из list2, начиная с позиции j.

5. Возврат результата

return merged_list

Функция возвращает окончательный список merged_list, который является отсортированным объединением двух входных списков.


Примеры работы функции

  1. Пример 1:
    • Вход: list1 = [1, 2, 4], list2 = [1, 3, 4].
    • Процесс:
      1. Сравниваются 1 и 1, добавляется 1 из list1.
      2. Сравниваются 2 и 1, добавляется 1 из list2.
      3. Сравниваются 2 и 3, добавляется 2 из list1.
      4. Сравниваются 4 и 3, добавляется 3 из list2.
      5. Добавляются оставшиеся элементы: 4 из list1 и 4 из list2.
    • Выход: [1, 1, 2, 3, 4, 4].
  2. Пример 2:
    • Вход: list1 = [], list2 = [].
    • Процесс:
      • Оба списка пусты, поэтому сразу возвращается пустой список.
    • Выход: [].
  3. Пример 3:
    • Вход: list1 = [], list2 = [0].
    • Процесс:
      • list1 пуст, поэтому добавляется весь list2.
    • Выход: [0].

 

Перейти к следующему шагу

Возникли вопросы при прочтении лекции? Задайте вопрос в комментариях

Комментарии