链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/
题意
给定一个链表,要求判断链表是否存在环,如果存在找出其中环的起点。
快慢指针的巧妙运用。已知快慢指针判断链表是否有环,只需要找到判两个指针是否相遇。
设链表中环外部分的长度为 a。slow 指针进入环后,又走了b的距离与fast相遇。此时,fast指针已经走完了环的n圈,因此它走过的总距离为
由于fast指针走过的距离都为slow指针的2倍,于是有
我们会发现:从相遇点到入环点的距离加上 n-1n−1 圈的环长,恰好等于从链表头部到入环点的距离。
解法
当 slow 和 fast 第一次相遇时,我们将 fast 重新移动到链表开头,并让 slow 和 fast 每次都前进一步。当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。
1 | /** |
v1.5.2