判断一个链表是否有环
快指针每次走两步,慢指针每次走一步
第一次相遇:slow指针行走了 m+An+k(A表示slow行走了A圈环形。附:An 是因为如果环够大,则他们的相遇需要经过好几环才相遇)。fast行走了 m+B*n+k。
接下来slow指针回到起点
开始入环的第一个节点:然后每次两个指针(slow,fast)都只移动一步,当slow移动了m,即到达了环的起点位置,此时fast总共移动了 2S+m,此时他们在环开始处相遇!
证明:第一次相遇slow走的路程s= m+An+k,fast走的路程为2s=m+Bn+k;(2s-s)=(B-A)n,说明fast和slow走的路程都是环长度的倍数,此时slow回到原节点再走m步将到达入环的第一个节点,而fast走m步也将到达入环的第一个节点。他们将再次在此第一次相遇!
如果要求环的长度,可以这样做:
当两者相遇之后,固定一个指针,让另一个指针行走一圈,使用count计数,如果两个指针相等(即相遇),则count即为环的长度