題目來源:LeetCode160求兩單鏈表的交點
一、思路
- 如果兩個鏈表沒有交點,返回 null.
- 在返回結果後,兩個鏈表仍須保持原有的結構。
- 可假定整個鏈表結構中沒有循環。
- 程序儘量滿足 O(n) 時間複雜度,且僅用 O(1) 內存。
1.1 知識點
直觀感覺,如果兩條鏈表有交點,那麼由於單鏈表的關係(只有唯一後繼),交點之後都是相同的。粗糙的解法是:通過遍歷獲得兩條鏈表的長度,指向較長鏈表的指針先行一個長度差的距離;而後指向兩鏈表的指針同時前進,直到相等(即爲相遇點)或者到達鏈表末尾。
再仔細想想的話,指向較長鏈表的指針先行一個鏈表長度差的目的是什麼呢?是不是消除兩鏈表的長度差呢。消除了長度差以後,兩根指針一同前進,相遇也也就找到交點了。值得注意的是,兩根指針走過的路程是不同的。那能否在兩根指針走的路徑時相同的情況下,消除長度差呢?當然也是可以的。
兩根指針,都走過了兩鏈表的長度之和。此時,兩根指針走過的路程是相同的。 結合動圖理解一下:
如果GIF看的比較亂的話,還有一個小視頻可以看看。
從視頻中,我們大概可以猜到,任何一根指針走過兩鏈表長度之和後,相交與否,結果已經確定了。
1.2 C/C++實現
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) {
return NULL;
}
ListNode *pA = headA, *pB = headB;
while (pA != pB) {
pA = !pA ? headB : pA->next;
pB = !pB ? headA : pB->next;
}
return pA;
}