带环链表求环的起点

Aiur · Zellux at 
很经典的问题了,求环的长度可以用两个步长分别为 1 和 2 的指针遍历链表,直到两者相遇。相遇后把其中指针重新设定为起始点,让两个指针以步长 1 再走一遍链表,相遇点就是环的起始点。证明也很简单,注意第一次相遇时慢指针走过的路程 S1 = 非环部分长度 + 弧 A 长快指针走过的路程 S2 = 非环部分长度 + n * 环长 + 弧 A 长 S1 * 2 = S2,可得非环部分长度 = n * 环长 - 弧 A 长指针 A 回到起始点后,走过一个非环部分长度,指针 B 走过了相等的长度,也就是 n * 环长 - 弧 A 长,正好回到环的开头。……