n。
此圖表示其實狀態,其中h
h表示煉表頭節點,slo
w,fa
stslow,fast
,起始狀態指向hh,t
t表示環的入口節點。
此圖表示slo
wslow
運動到了tt,f
astfast
運動到m1m1
,節點h
h和節點t
t之間的距離為a
a,節點t
t和節點m1m1
之間的距離(弧長)為b
b,並設此時fas
tfast
在環上做了r
r次圓周運動(因為aa和n
n的長度都不固定,多以fas
tfast
可能已經在環上運動了好多圈了)。相對於slo
wslow
其運動的距離為:a
a由於fas
tfast
速度是slo
wslow
的二倍,所以其運動的距離(步數)為:2a2a
並且,經過觀察可知fas
tfast
運動的距離為:a+n
r+ba+nr+b
,所以可知公式①: =n
r+ba=nr+b
此時,slo
w,fa
stslow,fast
相遇在節點m2m2
,也就是**中10
10行判斷成立的地方。其中m2m2
為相遇點,b
b還是為弧長。由於鍊錶的指標是有方向的,我們約定在環上計算距離的時候按照逆時針計算,也就是說,從tt到m
1m1的距離為b
b,從m1m1
到tt的距離為n−b
n−b(其中n
n為環的長度)。
同理在情況2中,從fas
tfast到sl
owslow
的距離為n−b
n−b,它們的速度差為1
1,所以它們再次相遇的時候經過的時間為n−b
1=n−
bn−b1=n−b,sl
owslow
經過的距離為(n−
b)×1
=n−b
(n−b)×1=n−b
,所以假設相遇點為m2m2
,那麼顯而m2m2
到tt的距離為bb。
情況4對應著**中的11
11~19
19行。因為通過上面的討論,如果能讓q
q向前運動:b+x
nb+xn
步,那麼q
q的位置恰好是t
t,其中x∈x∈
。 值得高興的是,在情況2中我們有公式①,觀察到a
a恰好符合這樣乙個步數值,所以我們讓p=h
p=h,p,q
p,q,都每次向前移動1
1,當他們相遇的時候恰好就是環的入點t
t,也就是說pp從h
h移動到p,q
p,q再次相遇在這裡的作用是提供乙個計數。
所以,當pp,q
q再次相遇的時候,他們的相遇點恰好了t
t,也就是需要找的環的入口點。lo
wslow
和第二次迴圈的p
p,因為它們都是每次前進一步,由它們移動的步數,可以得到演算法的時間複雜度,所以易知時間複雜度為o(n
)o(n)
,空間複雜度為o(1
)o(1)
。
判斷單鏈表中是否有環,找到環的入口節點
相對簡潔的實現 宣告 文中有些地方並無冒犯之意,希望提及的部落格作者理解。沒有你們的幫助,對這個問題毫無頭緒。由於csdn部落格系統的內部錯誤,所有的公式後面都有一條惱人的豎線,實屬無奈。文章梗概 題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 牛客網題目鏈結 題目中沒有說是單鏈表,從給出的...
判斷單鏈表中是否有環,找到環的入口節點
相對簡潔的實現 宣告 文中有些地方並無冒犯之意,希望提及的部落格作者理解。沒有你們的幫助,對這個問題毫無頭緒。由於csdn部落格系統的內部錯誤,所有的公式後面都有一條惱人的豎線,實屬無奈。文章梗概 本文通過對現有資料的收集和整理,給出了一種相對簡單的嚴格證明的 判斷單鏈表是否有環,找到環的入口節點 ...
判斷單鏈表中是否有環,找到環的入口節點
相對簡潔的實現 宣告文中有些地方並無冒犯之意,希望提及的部落格作者理解。沒有你們的幫助,對這個問題毫無頭緒。由於csdn部落格系統的內部錯誤,所有的公式後面都有一條惱人的豎線,實屬無奈。文章梗概 題目描述 思考過程 n o n 的時間複雜度,但是可會有比較高的空間複雜度。相關問題的解法與證明 h1....