鍊錶中環的入口問題解析

2021-12-30 04:54:43 字數 1226 閱讀 8265

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。

假設x" role="presentation">xx為環前面的路程(黑色路程),a" role="presentation">aa為環入口到相遇點的路程(藍色路程,假設順時針走), c" role="presentation">cc為環的長度(藍色+橙色路程),當快慢指標相遇的時候:

此時慢指標走的路程為sslow=x+m∗c+a" role="presentation">sslow=x+m?c+asslow=x+m?c+a

快指標走的路程為sfast=x+n∗c+a" role="presentation">sfast=x+n?c+asfast=x+n?c+a

氣質快指標比慢指標多走了n−m" role="presentation">n?mn?m圈

可得:2sslow=sfast" role="presentation">2sslow=sfast2sslow=sfast

2∗(x+m∗c+a)=(x+n∗c+a)" role="presentation">2?(x+m?c+a)=(x+n?c+a)2?(x+m?c+a)=(x+n?c+a)

從而可以推導出:

x=(n−2∗m)∗c−a=(n−2∗m−1)∗c+c−a" role="presentation">x=(n?2?m)?c?a=(n?2?m?1)?c+c?ax=(n?2?m)?c?a=(n?2?m?1)?c+c?a

即環前面的路程 = 數個環的長度(為可能為0) + c−a" role="presentation">c?ac?a

什麼是c−a" role="presentation">c?ac?a?這是相遇點後,環後面部分的路程。(橙色路程)

所以,我們可以讓乙個指標從起點a開始走,讓乙個指標從相遇點b開始繼續往後走,

2個指標速度一樣,那麼,當從原點的指標走到環入口點的時候(此時剛好走了x" role="presentation">xx)

從相遇點開始走的那個指標也一定剛好到達環入口點。

所以2者會相遇,且恰好相遇在環的入口點。

最後,判斷是否有環,且找環的演算法複雜度為:

時間複雜度:o(n)

空間複雜度:o(1)

public class solution

if(p1 == p2)

return p1;}}

return null;

}}

鍊錶中環的入口結點 題解

coding utf 8 project exuding nlp all author tao time 2019 06 18 14 58 59 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。class listnode def init self,x self.val ...

鍊錶中環的入口

題目描述 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。思路 之前我們判斷鍊錶是否有環,用兩個指標,快慢指標,乙個走一步,乙個走兩步,在此基礎上,當兩個指標相遇,此時肯定在環中,那麼接著計算環的節點數,就利用相遇節點往前走,直到在次回到相遇點,即可計算環的節點數n,然後利...

鍊錶 鍊錶中環的入口結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。知識點回顧 快慢指標 思路 使用快慢指標 假設有p,q兩指標,p每步跨乙個結點,q每步跨兩個結點。那麼經過k步之後q比p多走過的結點數為k。如果鍊錶中沒有環,那麼q永遠在p的前面,兩指標不會相遇。如果鍊錶有環,且環中結點個數為...