Программа курса:
Задача 13: Пересечение двух связанных списков
Напишите определение функции def get_intersection_node(headA, headB), которая принимает два заголовка одиночно связанных списков headA и headB. Функция должна возвращать узел, в котором два списка пересекаются. Если два связанных списка вообще не пересекаются, функция должна вернуть None.
В этой и последующих задачах объекты типа: связанный список и бинарное дерево(и другие) будут представлены в виде заранее подготовленных, невидимых классов в вашем решении, которые мы будем так же прилагать в условиях задач, то есть ваша задача писать определение функции, опираясь на то, что классы в вашем коде заранее определены и главное это правильно пользоваться этими объектами(атрибутами и методами), если у вас будут возникать трудности в подобных задачах, то я настоятельно рекомендую смотреть разбор задачи.
Что такое одиночно связанный список?
Одиночно связанный список — это структура данных, где каждый узел содержит два элемента:
- Значение текущего узла (
val). - Ссылку на следующий узел в списке (
next), либоNone, если это последний узел.
Пример реализации:
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
Пример создания связанного списка:
node3 = ListNode(3) # Узел со значением 3, следующий узел отсутствует
node2 = ListNode(2) # Узел со значением 2
node2.next = node3 # Узел node2 указывает на node3
node1 = ListNode(1) # Узел со значением 1
node1.next = node2 # Узел node1 указывает на node2
# Список выглядит так: 1 -> 2 -> 3 -> NoneПримеры работы функции
Пример 1:
Входные данные:
listA = [4, 1, 8, 4, 5]
listB = [5, 6, 1, 8, 4, 5]
Пересечение: 8
Схема:
listA: 4 -> 1 -> 8 -> 4 -> 5
↘
listB: 5 -> 6 -> 1
Ожидаемый результат: Узел со значением 8.
Подробное пояснение:
- Описание структуры списков:
listAначинается с узлов4 -> 1, затем идет узел со значением8, после чего узлы4 -> 5.listBначинается с узлов5 -> 6 -> 1, затем пересекается сlistAна узле со значением8. После этого оба списка продолжают иметь общие элементы8 -> 4 -> 5.
- Процесс работы функции:
- Функция идет по
listAиlistB, чтобы найти узел, на котором списки пересекаются. - Узлы с одинаковыми значениями в списках (например,
1) не являются пересечением, так как они находятся в разных местах памяти. Пересечение подтверждается, если узлы указывают на одно и то же место в памяти.
- Функция идет по
- Результат:
- Узел со значением
8— это первая точка, гдеlistAиlistBпересекаются. После этого узла списки совпадают.
- Узел со значением
Пример 2:
Входные данные:
listA = [1, 9, 1, 2, 4]
listB = [3, 2, 4]
Пересечение: 2
Схема:
listA: 1 -> 9 -> 1 -> 2 -> 4
↘
listB: 3 -> 2 -> 4
Ожидаемый результат: Узел со значением 2.
Подробное пояснение:
- Описание структуры списков:
listAначинается с узлов1 -> 9 -> 1, затем идет узел со значением2, после чего узел4.listBначинается с узлов3, затем идет пересечение сlistAна узле со значением2, после чего оба списка имеют общие элементы2 -> 4.
- Процесс работы функции:
- Функция проверяет узлы
listAиlistBпо очереди, сравнивая их местоположение в памяти. - Пересечение найдено на узле со значением
2, так как он является общей точкой для обоих списков.
- Функция проверяет узлы
- Результат:
- Узел со значением
2— это первая точка пересечения. После этого узла списки совпадают.
- Узел со значением
xsnm
,listB.head.next.next.next=listA.head.next.next - есть пересечение
listB.head.next.next.next!=listA.head.next.next - нет пересечений