Программа курса:
Разбор задачи: Объединение двух отсортированных списков
Предложенный нами код решения:
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:
- Вход:
list1 = [1, 2, 4]
,list2 = [1, 3, 4]
. - Процесс:
- Сравниваются
1
и1
, добавляется1
изlist1
. - Сравниваются
2
и1
, добавляется1
изlist2
. - Сравниваются
2
и3
, добавляется2
изlist1
. - Сравниваются
4
и3
, добавляется3
изlist2
. - Добавляются оставшиеся элементы:
4
изlist1
и4
изlist2
.
- Сравниваются
- Выход:
[1, 1, 2, 3, 4, 4]
.
- Вход:
- Пример 2:
- Вход:
list1 = []
,list2 = []
. - Процесс:
- Оба списка пусты, поэтому сразу возвращается пустой список.
- Выход:
[]
.
- Вход:
- Пример 3:
- Вход:
list1 = []
,list2 = [0]
. - Процесс:
list1
пуст, поэтому добавляется весьlist2
.
- Выход:
[0]
.
- Вход: