一、若是链表没有环,那么快指针比慢指针先到达尾部(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的长度,再加上环的长度,即为链表的总长。