Программа курса:
Разбор задачи: Пересечение двух связанных списков
Вид объекта - Связанный список:
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = NoneПредложенный нами код решения:
def get_intersection_node(headA, headB):
"""
Находит узел пересечения двух связанных списков.
:param headA: Начальный узел первого списка.
:param headB: Начальный узел второго списка.
:return: Узел пересечения или None, если пересечения нет.
"""
if not headA or not headB:
return None
pointerA, pointerB = headA, headB
while pointerA != pointerB:
pointerA = pointerA.next if pointerA else headB
pointerB = pointerB.next if pointerB else headA
return pointerAПошаговый разбор:
- Инициализация указателей:
pointerAначинает обход сheadA(начала первого списка).pointerBначинает обход сheadB(начала второго списка).
- Цикл сравнения узлов:
- На каждой итерации указатели
pointerAиpointerBсравниваются. - Если они равны, то это точка пересечения, и она возвращается.
- На каждой итерации указатели
- Переключение указателей:
- Если указатель
pointerAдостигает конца спискаA, он переключается на начало спискаB. - Если указатель
pointerBдостигает конца спискаB, он переключается на начало спискаA.
- Если указатель
- Завершение цикла:
- Цикл завершится, если указатели встретятся на одном узле (точке пересечения) или оба станут
None(если пересечения нет).
- Цикл завершится, если указатели встретятся на одном узле (точке пересечения) или оба станут
- Возврат результата:
- Если пересечение найдено, возвращается узел пересечения.
- Если пересечения нет, возвращается
None.
Как работает переключение указателей?
Пример пересекающихся списков:
listA: 4 -> 1 -> 8 -> 4 -> 5
↘
listB: 5 -> 6 -> 1
- Итерация 1:
pointerAна узле4,pointerBна узле5. Узлы разные.
- Итерация 2:
pointerAна узле1,pointerBна узле6. Узлы разные.
- Итерация 3:
pointerAна узле8,pointerBна узле1. Узлы разные.
- Итерация 4:
pointerAна узле4,pointerBпереключается на4(началоlistA).
- Итерация 5:
pointerAна узле5(началоlistB),pointerBна узле1.
- Итерация 6:
- Оба указателя встречаются на узле
8. Это пересечение.
- Оба указателя встречаются на узле
Пример списков без пересечения:
listA: 2 -> 6 -> 4
listB: 1 -> 5
- Указатели проходят списки полностью.
- После переключения на противоположные списки указатели снова проходят их.
- После двух полных проходов указатели оба становятся
None. Это подтверждает отсутствие пересечения.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии