1. 程式人生 > 其它 >劍指offer |52. 兩個連結串列的第一個公共節點

劍指offer |52. 兩個連結串列的第一個公共節點

技術標籤:演算法訓練營

題目:

輸入兩個連結串列,找出它們的第一個公共節點。

如下面的兩個連結串列:
在這裡插入圖片描述輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
輸出:Reference of the node with value = 8
輸入解釋:相交節點的值為 8 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,連結串列 A 為 [4,1,8,4,5],連結串列 B 為 [5,0,1,8,4,5]。在 A 中,相交節點前有 2 個節點;在 B 中,相交節點前有 3 個節點。

思路: 雙指標,設A長L1+C,B長L2+C,其中C是公共部分,兩個指標pa、pb同時從連結串列頭開始遍歷,當pa遍歷完A就回到B表頭繼續遍歷,當pb遍歷完B就回到A表頭,當兩個指標相遇也就是都走了L1+L2+C的長度,那麼停下來的時候要麼是第一個公共節點要麼是沒有公共節點。

  • 時間複雜度:O(M+N)。
  • 空間複雜度:O(1)

程式碼:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if (!headA || !headB) {return nullptr;} ListNode *posA = headA, *posB = headB; while (posA || posB) { if (!posA) { posA = headB; } if
(!posB) { posB = headA; } if (posA == posB) { return posA; } posA = posA -> next; posB = posB -> next; } return nullptr; } };

參考:位元組題庫 - #劍52 - 簡單 - 兩個連結串列的第一個公共節點 - 1刷