鍊錶中環的入口結點

2021-08-28 17:17:08 字數 878 閱讀 5316

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

/*

public class listnode }*/

public class solution

listnode p1 = phead;

listnode p2 = phead;

boolean first = true;

while (first || p1 != p2)

if (p2.next.next == null)

p2 = p2.next.next;

p1 = p1.next;

first = false;

} p1 = phead;

while (p1 != p2)

return p1;

}}

思路:即設定兩個點p1,p2,同時從起點走,p2以兩倍速度走,走到第乙個相交的點後,此時把p1放回起點,然後p1和p2再以相同的速度走,然後第乙個相交的節點就是環的入口

知其然不知所以然還不夠,我詳細做了證明:

1.假設起點為a,交點為b,a到b的距離為a,b轉一圈回到b的距離為b(周長),定a=mb+c(m>=0,0<=c2.當慢指標到達b的時候走了a,此時快指標走了2a,即快指標在環上走了a,設此時快指標的位置c1,根據a=mb+c,即b到c1的距離為c,c1到b的距離為b-c

3.此時兩個指標都在環上,快指標追上慢指標需要時間t=(b-c)/v(v是相對速度,=2v-v),這個時間慢指標走了b-c的距離,即c2,即快慢指標第一次相交的點,此時c2到b的距離為b-(b-c)=c

4.此時慢指標回到起點a,快指標停在c2,兩者再以相同的速度走,由a=mb+c,所以肯定會在交點b相遇,且相交時,快指標已經走了m圈

鍊錶中環的入口結點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。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,此...