一、若是鏈表沒有環,那麼快指針比慢指針先到達尾部(null)。spa
二、若是鏈表有環的話,由於快指針走的比慢指針快,因此在環中相遇的過程能夠看做是快指針從環後邊追趕慢指針的過程。指針
用遞歸法證實,快慢指針必定會相遇:blog
(1)快指針與慢指針之間差一步。此時繼續日後走,慢指針前進一步,快指針前進兩步,二者相遇。
(2)快指針與慢指針之間差兩步。此時繼續日後走,慢指針前進一步,快指針前進兩步,二者之間相差一步,轉化爲第一種狀況。
(3)快指針與慢指針之間差N步。此時繼續日後走,慢指針前進一步,快指針前進兩步,二者之間相差(N+1-2)即N-1步。重複這個過程,直到快指針和慢指針相遇。遞歸
快指針F先進環,慢指針S後進。get
假設慢指針進環那一刻快指針差m步能追上(0<= m < Length環),根據上邊結論,兩個指針走m次就會相遇了。同步
由於m < Length環,因此快指針在慢指針進環那一刻最多比慢指針多繞一個圈。io
快指針和慢指針第一次相遇時的節點pq(碰撞點),快指針和慢指針從該點開始繼續往前走,再次碰撞時所用的操做數就是環的長度Length環。im
證實:由上邊的推導可得,這裏的m爲Lengh環。鏈表
假設慢指針進入環中時,即鏈接點p,快指針(q)須要m步才能追上慢指針。img
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的長度,再加上環的長度,即爲鏈表的總長。