鍊錶中環的入口結點(牛客網)
類似於追及問題:
如何判斷有環的存在?
在追及問題中,我們可以用兩個速度不同的物體從同一地點出發,如果相遇則證明存在環(可用反證法證明,若不存在環,則速度不同的物體從同一地點出發則一定不會相遇),因此可以模擬過來,定義兩個指標fast、slow,令兩指標以不同速度向後指,則相遇時證明有環存在,若fast指向null,則不存在環。
怎麼找到環的入口結點?
首先說方法:在問題一中兩指標相遇後,讓乙個指標從頭結點開始,另乙個從相遇結點開始,並以相同速度向後指,再次相遇時就是環的入口結點。
證明:1)假設存在環,fast以速度2執行,slow以速度1執行,在slow走到入口t時,如圖(m1為在slow首次到t時fast的位置,a為h到t的距離,b為t到m1的距離,n為環的周長):
由圖知fast走的距離為a+b+xn
,slow走的距離為a
,又v(fast) = 2*v(slow)
,所以x(fast) = 2*x(slow)
,即2a = a+b+xn
,因此a = b+xn
。
m1逆時針到t的距離為n-b。
2)在首次相遇時,如圖(m2為相遇點):
由於m1逆時針到t的距離為n-b,即要達到相遇需要追趕n-b
的距離,由於兩者速度差為1,因此需要n-b
的時間才能相遇,此時slow再次向後n-b距離,即到達m2位置與fast相遇,因為一周長度為n,因此到t的距離為n-(n-b) = b
。
3)為何令slow重新從phead以速度1開始走,令fast從m2以速度1走?要想在入口t相遇,則需要從m2處再走b+yn
的距離,剛好phead處符合(由1)可知,同時因為是乙個環,所以即使相差整數圈的距離也是在圈的同乙個位置),所以令slow從phead開始走。在相遇後就是入口t的位置。
/*
struct listnode
};*/
class solution
listnode *fast = phead, *slow = phead;
while( fast && fast->next )
return slow;}}
return null;}};
鍊錶中環的入口結點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...
鍊錶中環的入口結點
題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...
鍊錶中環的入口結點
題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路1 設環中結點數是n,環的入口位置是x 距離起點走多少步 用快慢指標p,q,q移動的速度是p的2倍,當兩個指標相遇時p走的步數是y,q走的步數是2y,q比p多走k個環的距離,即 2y y kn,則y kn。p距離環的入口點的距離為y x,此...