判斷單鏈表中是否有環,找到環的入口節點

2021-08-19 07:10:47 字數 2742 閱讀 9555

相對簡潔的實現

宣告文中有些地方並無冒犯之意,希望提及的部落格作者理解。沒有你們的幫助,對這個問題毫無頭緒。

由於csdn部落格系統的內部錯誤,所有的公式後面都有一條惱人的豎線,實屬無奈。

文章梗概

題目描述

思考過程(n

)o(n)

的時間複雜度,但是可會有比較高的空間複雜度。

相關問題的解法與證明

h1.如何判斷是否存在環?lo

w、fa

stslow、fast

,均從頭指標開始,每次分別前進1步、2步。如存在環,則兩者相遇;如不存在環,fas

tfast

遇到null

null

退出。其中主要的思想就是「環形相遇追及問題」,理解上應該不複雜。lo

w、fa

stslow、fast

從該點開始,再次相遇時slo

wslow

所經過的節點數就是環的長度。

從環上的任意一點開始,slo

w、fa

stslow、fast

再次相遇時slo

wslow

經過的節點數就是環的長度,因為此時slo

w、fa

stslow、fast

起始距離為環長,速度差為1

1。選擇問題1的相遇點為起始點是為了確保起始點為環上的一點。1m1

,賦值p=m

1p=m1,q=

hq=h

,其中h

h為煉表頭結點,然後p,q

p,q每次1步向前運動,p,q

p,q再次相遇所在的位置就是環的入口節點(環的連線點)。

這裡和上面提到的部落格中的敘述差別非常大,這也是其有些問題的地方,我在這裡更正了其說法,並給出了相對嚴格的證明。

public

class solution

if(p == q)

return q;}}

return

null;

}

**及問題三的證明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,也就是需要找的環的入口點。

複雜度low

slow

和第二次迴圈的p

p,因為它們都是每次前進一步,由它們移動的步數,可以得到演算法的時間複雜度,所以易知時間複雜度為o(n

)o(n)

,空間複雜度為o(1

)o(1)

判斷單鏈表中是否有環,找到環的入口節點

相對簡潔的實現 宣告 文中有些地方並無冒犯之意,希望提及的部落格作者理解。沒有你們的幫助,對這個問題毫無頭緒。由於csdn部落格系統的內部錯誤,所有的公式後面都有一條惱人的豎線,實屬無奈。文章梗概 題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 牛客網題目鏈結 題目中沒有說是單鏈表,從給出的...

判斷單鏈表中是否有環,找到環的入口節點

相對簡潔的實現 宣告 文中有些地方並無冒犯之意,希望提及的部落格作者理解。沒有你們的幫助,對這個問題毫無頭緒。由於csdn部落格系統的內部錯誤,所有的公式後面都有一條惱人的豎線,實屬無奈。文章梗概 本文通過對現有資料的收集和整理,給出了一種相對簡單的嚴格證明的 判斷單鏈表是否有環,找到環的入口節點 ...

判斷單鏈表中是否有環

define crt secure no deprecate include include include include define ok 1 define error 0 define true 1 define false 0 typedef int status 函式結果狀態 如ok。t...