鍊錶交點問題

2021-10-24 13:58:41 字數 1694 閱讀 4999

鍊錶交點問題也屬公司青睞的專題之一,一般依靠雙指標來解決,主要分為鍊錶判環和鍊錶相交兩大專題。

判斷鍊錶是否有環,若有環,則返回環入口節點。

這題就是典型的快慢指標問題,**很簡單,但具體理論證明卻十分值得研究。

首先先說解法, 分兩部分,判環和尋找入口:

判環部分,設定兩個指標(快指標fa一次走兩個節點,慢指標sl一次走乙個節點),若快指標走到了鍊錶尾即空節點則說明鍊錶無環,否則在環中快慢指標必能相遇。

尋找入口部分,慢指標不變,快指標移至煉表頭,並也開始一步一節點的行走,雙指標同時移動,相遇處即為環入口

判環部分不難理解,如操場跑圈一般,快者定能追上慢著。然而尋找入口部分就顯得十分玄學了,下面我們開始理論證明。

假設鍊錶由長度為

那麼此時,快指標走了

不難發現,若想找到環入口,從鏈頭開始,指標必須前進

恰巧,快指標回歸鏈頭一步一點走

/*

author owen_q

*//**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

if(fa == null)

return fa;

fa = head;

while(fa != sl)

return fa;}};

經典鍊錶相交問題,倆無環單鏈表判斷是否相交

若鍊錶相交,一定是尾相交,因此提前算出倆鍊錶長度,然後雙指標分別指向兩個鍊錶的頭部,長的鍊錶先提前移動到相同長度的位置,之後雙指標同時移動,若相交則雙指標必能相遇。總複雜度為

/*

author owen_q

*//**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

t = headb;

while(t!=null)

while(an>bn)

while(bn>an)

while(an>0)

return null;}};

這題還有個很巧妙的解法,就是兩個指標分別按不同順序遍歷兩個鍊錶,若鍊錶相交則雙指標也必定會相遇。這個演算法的複雜度將會降為

/*

author owen_q

*//**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

return a;}};

將上述兩個問題結合,又可以形成乙個新的問題,即判斷兩個可能帶環的鍊錶是否存在交點

由於鍊錶可能帶環,因此長度型和遍歷型鍊錶判環方法都無法適用。於是不如先判環,下面分類討論可能存在的情況。

首先對兩個鍊錶判環

兩個鍊錶在環前相交,那麼兩個鍊錶的入環口定為同乙個節點,比較入環口即可

兩個鍊錶在環上相交,那麼同樣是利用快慢指標,讓不同速度的指標從不同入環口同時出發,若快慢指標可以相遇則為環上相交,而兩個入環口均可以被視為相交點

若慢指標跑了一圈後雙指標仍未相遇,則說明兩個鍊錶不相交

單向鍊錶是否有交點以及查詢交點

如何判斷是否有交點?兩個單向鍊錶,如果有交點,那麼它們最後的乙個結點必定是同乙個結點。我們可以找到鍊錶最後乙個結點,比較它們是否是同乙個結點。如果兩個鍊錶有交點,如何判斷交點的位置呢?把乙個鍊錶中的每乙個結點與另乙個鍊錶的中每乙個結點做比較,如果找到相同的,那麼這個相同的就是交點了。但是這個演算法的...

單向鍊錶是否有交點以及查詢交點

如何判斷是否有交點?兩個單向鍊錶,如果有交點,那麼它們最後的乙個結點必定是同乙個結點。我們可以找到鍊錶最後乙個結點,比較它們是否是同乙個結點。如果兩個鍊錶有交點,如何判斷交點的位置呢?把乙個鍊錶中的每乙個結點與另乙個鍊錶的中每乙個結點做比較,如果找到相同的,那麼這個相同的就是交點了。但是這個演算法的...

鍊錶 找出兩個鍊錶的交點

一 暴力求解法 思路 有2個鍊錶,所以我們可以使用雙重迴圈,先遍歷第乙個鍊錶,在遍歷第乙個鍊錶的同時裡面巢狀遍歷第二個鍊錶。如下 這裡需要注意的是第二個鍊錶會多次的遍歷,所以遍歷完一次之後需要將指標?放到第乙個節點上面,這樣才可以繼續遍歷這個鍊錶。暴力法求解 遍歷2個鍊錶 param heada p...