每日leetcode——160. 相交連結串列

Ethan發表於2022-03-04

題目

給你兩個單連結串列的頭節點 headA 和 headB ,請你找出並返回兩個單連結串列相交的起始節點。如果兩個連結串列不存在相交節點,返回 null 。

題目資料 保證 整個鏈式結構中不存在環。
注意,函式返回結果後,連結串列必須 保持其原始結構 。

輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
輸出:Intersected at '8'
解釋:相交節點的值為 8 (注意,如果兩個連結串列相交則不能為 0)。
從各自的表頭開始算起,連結串列 A 為 [4,1,8,4,5],連結串列 B 為 [5,6,1,8,4,5]。
在 A 中,相交節點前有 2 個節點;在 B 中,相交節點前有 3 個節點。

雜湊表

最簡單的思路,遍歷連結串列A,把每個節點存在一個字典(hash表)中。
再遍歷字典B,看B的當前節點是否在字典中,存在的話就是相交節點。

雙指標

定義兩個指標A,B,分別從各自的連結串列表頭開始遍歷,
如果兩個指標指向的節點不同,就繼續向後移動
如果兩個指標指向的節點相同,則找到了相交節點,包括兩個不相交的連結串列,兩個指標最終都會移動到尾部節點指向的None,則也會返回None
當某個指標移動到連結串列末尾時,跳轉到另一個連結串列的表頭開始遍歷,這樣做能保證兩個不對稱的相交連結串列,經過指標移動,最終總能同時移動到相交節點上

def getIntersectionNode(headA,headB):
    if not headA or not headB:
        return None

    A,B = headA,headB
    while A!=B:
        A = A.next if A else headB
        B = B.next if B else headA
    return A

相關文章