快慢指針找鏈表環相關理論


一、一定會相遇的證明

1、如果鏈表沒有環,那么快指針比慢指針先到達尾部(null)

2、如果鏈表有環的話,因為快指針走的比慢指針快,所以在環中相遇的過程可以看作是快指針從環后邊追趕慢指針的過程。

用遞歸法證明,快慢指針一定會相遇:

(1)快指針與慢指針之間差一步。此時繼續往后走,慢指針前進一步,快指針前進兩步,兩者相遇。
(2)快指針與慢指針之間差兩步。此時繼續往后走,慢指針前進一步,快指針前進兩步,兩者之間相差一步,轉化為第一種情況。
(3)快指針與慢指針之間差N步。此時繼續往后走,慢指針前進一步,快指針前進兩步,兩者之間相差(N+1-2)即N-1步。重復這個過程,直到快指針和慢指針相遇。

因此,此題得證。所以快指針必然與慢指針相遇。

參考:
作者:知乎用戶
鏈接: https://www.zhihu.com/question/23208893/answer/117115415
 

推導:慢指針進入環后,快指針最多多繞一個圈。

快指針F先進環,慢指針S后進。

假設慢指針進環那一刻快指針差m步能追上(0<= m < Length),根據上邊結論,兩個指針走m次就會相遇了。

因為m < Length,所以快指針在慢指針進環那一刻最多比慢指針多繞一個圈。

 

二、環長度

快指針和慢指針第一次相遇時的節點pq(碰撞點),快指針和慢指針從該點開始繼續往前走,再次碰撞時所用的操作數就是環的長度Length

證明:由上邊的推導可得,這里的m為Lengh

 

三、連接點

 

假設慢指針進入環中時,即連接點p,快指針(q)需要m步才能追上慢指針。

p和q第一次相遇時,碰撞點在pq處。此時,p走到pq時用了m步。

 假設head到p的距離為a,環長度為Length,慢指針走了s步,則快指針走了2s步。

從上圖可知:

s = a + m

2s = a + m + n * Length(n為快指針繞環的圈數)

可得

a = n * Length- m

也就是:若在頭結點和相遇結點分別設一指針,同步(單步)前進,則最后一定相遇在環入口結點p。

可根據這個結論來找到入口節點。

四、帶環鏈表總長度

找到連接點p后,求head到p的長度,再加上環的長度,即為鏈表的總長。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM