重要声明:感谢超群同学提供的清晰证明。版权归超群同学所有。本人只是转发,不作为任何商业用途使用。
题目大意:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
以下是证明过程:
a 从开头到环入口的长度
b 环的长度
r 首次相遇时,从入口点走了的长度
s1 = a + x*b + r 相遇时slow指针走过的长度
s2 = a + y*b + r 相遇时fast指针走过的长度
根据快慢指针的行为可知 2*s1 = s2
替换得 2*(a+xb+r) = a+yb+r
左右两边变换后得 2*(a+r)-(a+r) = (y-2*x)*b
整理得 a+r = b*(y-2x)
说明a+r是环长的整数倍。首次相遇时,从入口点走了r长度,根据前述结论可知,再走a长度就能凑够整数倍的环长,即到达入口点。