leetcode 142. 环形链表 II|刷题打卡
本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
说明:不允许修改给定的链表。
进阶:你是否可以使用 O(1) 空间解决此题?
输入
输出
二、思路分析:
- 利用双指针的思想
- 链表成环的特点:让两个指针p1,p2位于链表起点并同时移动,p1速度快,p2速度慢。若链表成环,则p1和p2一定会相遇。
- 链表成环的位置:当p1,p2相遇后,把其中一个指针(p2)放回到链表起点。然后p1,p2同时移动,速度相同。当p1,p2相遇,该节点就是链表成环的节点。
三、AC 代码:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var detectCycle = function (head) {
let p1 = head
let p2 = head
if (!head || !head.next) return null
while (p1) {
p1 = p1.next
if (!p1) return null
p1 = p1.next
if (!p1) return null
p2 = p2.next
if (p1 == p2) break
}
p2 = head;
while (1) {
if (p1 == p2) return p2
p1 = p1.next
p2 = p2.next
}
}
四、总结:
链表成环的位置证明:
当slow 到达成环处时,fast在它的前面a%x处
fast会追上slow 用时 x-a%x
此时slow 走了 x-a%x.
然后fast回到A 以1的速度走a后到达成环处.
此时slow在(x-a%x+a)%x=0 也回到了成环处.
slow fast 相遇 成环处找到.