劍指offer |52. 兩個連結串列的第一個公共節點
阿新 • • 發佈:2020-12-25
技術標籤:演算法訓練營
題目:
輸入兩個連結串列,找出它們的第一個公共節點。
如下面的兩個連結串列:
輸入: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;
}
};