單鏈表-鏈表相交問題

題目來源:LeetCode160求兩單鏈表的交點 

一、思路

舉例1-相交的情形
舉例2-不相交的情形
  • 如果兩個鏈表沒有交點,返回 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章