【LeetCode】142. Linked List Cycle II 解题记录
问题描述
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail’s next pointer is connected to. Note that pos is not passed as a parameter.
Notice that you should not modify the linked list.
测试样例
1 | Input: head = [3,2,0,-4], pos = 1 |
1 | Input: head = [1,2], pos = 0 |
1 | Input: head = [1], pos = -1 |
说明
1 | The number of the nodes in the list is in the range [0, 10^4]. |
解题
思路
对于链表找环路的问题,有一个通用的解法——快慢指针(Floyd 判圈法)。
-
给定两个指针,分别命名为
slow
和fast
,起始位置在链表的开头。 -
每次
fast
前进两步,slow
前进一步。- 如果
fast
可以走到尽头,那么说明没有环路; - 如果
fast
可以无限走下去,那么说明一定有环路,且一定存在一个时刻slow
和fast
相遇。
- 如果
-
当
slow
和fast
第一次相遇时,将fast
重新移动到链表开头,并让slow
和fast
每次都前进一步。 -
当
slow
和fast
第二次相遇时,相遇的节点即为环路的开始点。
补充:
- 双指针
- 快慢指针
- 时间复杂度
O(n)
假设:
- 链表头是
X
, - 环的第一个节点是
Y
, - 环的长度是
L
, - 各段的长度分别是
a, b, c
, slow
和fast
第一次的交点是Z
,
第一次相遇时,
slow
走过的距离为a + b
,fast
走过的距离为a + b + c + b
。
因为 fast
的速度是 slow
的两倍,所以 fast
走的距离是 slow
的两倍,有 2(a + b) = a + b + c + b
,可以得到 a = c
。
此时,slow
位于 Z
,令 fast
位于首节点 X
,两指针每次均前进一步,由于 a = c
,则两指针必相遇于 Y
点。
代码
1 | /** |