鍊錶中環的入口結點

2021-08-20 06:09:31 字數 1342 閱讀 4215

鍊錶中環的入口結點(牛客網)

類似於追及問題:

如何判斷有環的存在?

在追及問題中,我們可以用兩個速度不同的物體從同一地點出發,如果相遇則證明存在環(可用反證法證明,若不存在環,則速度不同的物體從同一地點出發則一定不會相遇),因此可以模擬過來,定義兩個指標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,此...