Menu
CoddyTech

Intersection of Two Linked Lists

Dwie jednokierunkowe listy połączone są przechowywane w jednej puli węzłów. Węzeł i prowadzi do węzła next[i], a -1 oznacza koniec listy. Lista A zaczyna się od węzła headA, a lista B od węzła headB. Węzły nie są przechowywane w określonej kolejności, więc podążaj za połączeniami.

Listy mogą się łączyć: od pewnego węzła biegną dalej przez te same węzły aż do końca. Zwróć indeks pierwszego węzła występującego na obu listach albo -1, jeśli nie mają wspólnych węzłów.

Funkcja

getIntersectionNode(next: integer-array, headA: integer, headB: integer) → integer
nextinteger-array
indeks węzła, z którym łączy się dany węzeł, lub -1 dla ostatniego węzła listy
headAinteger
pierwszy węzeł listy A
headBinteger
pierwszy węzeł listy B
Zwracainteger
pierwszy węzeł wspólny dla obu list lub -1

Ograniczenia

  • 2 ≤ n ≤ 104, gdzie n jest długością next.
  • Każde next[i] ma wartość -1 lub jest indeksem węzła od 0 do n-1.
  • 0 ≤ headA, headB ≤ n-1 i headA ≠ headB.
  • Obie listy kończą się na -1 bez odwiedzania węzła dwa razy. Nie ma cyklu.
  • Każdy węzeł znajduje się na liście A, na liście B albo na obu listach.

Przykłady

Wejście
next = [-1, 4, 1, 5, 0, 1]headA = 3headB = 2
Wyjście
1
Wyjaśnienie
A odwiedza 3, 5, 1, 4, 0, a B odwiedza 2, 1, 4, 0. Od węzła 1 dalej mają wspólny każdy węzeł, a żaden wcześniejszy węzeł A nie znajduje się na ścieżce B, więc odpowiedzią jest 1.
challenge icon

Pytanie dodatkowe

Czy potrafisz znaleźć węzeł w czasie O(m + k), używając dodatkowej pamięci O(1)?

Zresetuj kod
def getIntersectionNode(next, headA, headB):
    # Napisz kod tutaj

Test #1

Test #2

Test #3

Argumenty

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

Oczekiwany wynik

1