Menu
CoddyTech

Intersection of Two Linked Lists

Два односвязных списка находятся в одном пуле узлов. Узел i ссылается на узел next[i], а -1 завершает список. Список A начинается с узла headA, а список B — с узла headB. Узлы хранятся в произвольном порядке, поэтому следуйте по ссылкам.

Два списка могут пересекаться: начиная с некоторого узла, они продолжаются через одни и те же узлы до конца. Верните индекс первого узла, который есть в обоих списках, или -1, если у них нет общих узлов.

Функция

getIntersectionNode(next: integer-array, headA: integer, headB: integer) → integer
nextinteger-array
индекс узла, на который ссылается каждый узел, или -1 для последнего узла списка
headAinteger
первый узел списка A
headBinteger
первый узел списка B
Возвращаетinteger
первый узел, общий для двух списков, или -1

Ограничения

  • 2 ≤ n ≤ 104, где n — длина next.
  • Каждый элемент next[i] равен -1 или индексу узла от 0 до n-1.
  • 0 ≤ headA, headB ≤ n-1 и headA ≠ headB.
  • Оба списка заканчиваются на -1, не посещая ни один узел дважды. Цикла нет.
  • Каждый узел находится в списке A, в списке B или в обоих.

Примеры

Ввод
next = [-1, 4, 1, 5, 0, 1]headA = 3headB = 2
Вывод
1
Пояснение
A проходит через 3, 5, 1, 4, 0, а B — через 2, 1, 4, 0. Начиная с узла 1, они проходят через все общие узлы, и ни один из более ранних узлов A не встречается у B, поэтому ответ — 1.
challenge icon

Дополнительный вопрос

Сможешь найти узел за время O(m + k), используя O(1) дополнительной памяти?

Сбросить код
def getIntersectionNode(next, headA, headB):
    # Напишите код здесь

Тест #1

Тест #2

Тест #3

Аргументы

next = [-1, 4, 1, 5, 0, 1]
headA = 3
headB = 2

Ожидаемый вывод

1