問題描述:
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。
假設x為環前面的路程(紅色路程),a為環入口到相遇點的路程(綠色路程,假設順時針走), c為環的長度(藍色路程)
設定快慢指標fast和slow,快指標的速度是慢指標的兩倍
當快慢指標相遇的時候:
此時慢指標走的路程為sslow =
x + m * c + a
快指標走的路程為sfast = x + n * c + a
2 sslow =
sfast
2 * ( x + m*c + a ) = (x + n *c + a)
從而可以推導出:
x = (n
- 2 * m )*c - a
= (n - 2 *m -1 )*c + c - a
即環前面的路程 =
數個環的長度(為可能為0) + c - a
什麼是c - a?這是相遇點後,環後面部分的路程(橙色路程)和x(紅色路程)相等
classsolution:
defentrynodeofloop(self, phead):
#write code here
if phead==none or phead.next==none or phead.next.next==none:
return
none
#一快一慢
low=phead.next
fast=phead.next.next
#如果有環,兩者會相遇
while low!=fast:
if fast.next==none or fast.next.next==none:
return
none
low=low.next
fast=fast.next.next
#相遇時的位置到環入口的距離和起始點到環入口的距離相同
fast=phead
while low!=fast:
low=low.next
fast=fast.next
return fast
劍指Offer 鍊錶中環的入口節點
1.如果鍊錶中有環,可以通過快慢指標,最後快慢指標肯定會相會於環中的某個節點 2.從這個相會的節點開始,當再次遇到該節點,即可統計環中有節點數 n 3.設定兩個指標p,p1,p從頭先走 n 步,p1在頭部,然後兩個指標同時 走,當兩指標相遇時,相遇的節點即是環的入口。c struct listnod...
劍指Offer 鍊錶中環的入口結點
第一步 先找到環中的乙個點 第二步 確定環中有幾個元素,比如n個 第三步 讓第乙個指標先走n步,第二個指標再從頭走,兩指標相遇即為入口結點 class solution def entrynodeofloop self,phead write code here meetingnode self.m...
劍指offer 鍊錶中環的入口結點
假設x為環前面的路程 黑色路程 a為環入口到相遇點的路程 藍色路程,假設順時針走 c為環的長度 藍色 橙色路程 當快慢指標相遇的時候 此時慢指標走的路程為sslow x m c a 快指標走的路程為sfast x n c a 2 sslow sfast 2 x m c a x n c a 從而可以推...