乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。
假設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的前面,兩指標不會相遇。如果鍊錶有環,且環中結點個數為...