求环形链表的入环点
题目要求,是让我们返回一条环形链表的入环点,比如链表a = 1->3->4->5->6->7->8->5,返回值为5的那个节点。
思路一:快慢指针定位
- 假设链表头节点位置离链表入环点的距离为a。
- 此时慢指针走到入环点时,慢指针距离为a,快指针距离为2a.
- 假设环的长度为a + x,此时快指针想要追上慢指针就需要x步,也就是x轮,因为在一个圆圈里面,一个走两步一个走一步,每一轮就多追上一步,这样在x轮后快慢指针相遇,此时当前相遇点离入环点距离就等于 (a+x)- x = a;
- 由此推理可得头节点到入环点的距离,等于快慢指针相遇点到入环点的距离。那么我们将头结点和相遇点一起循环往下走,当它们再次相遇时就找到了入环点。
思路一:JS代码实现
var detectCycle = function(head) {
if (!head) return null;
let p = head; // 慢指针
let q = head; // 快指针
while (q && q.next) {
p = p.next;
q = q.next.next;
if (q === p) { // 代表链表有环,且快慢指针相遇
let temp = head; // 重新获取头结点
while (q !== temp) { // 头结点和相遇点每次都走一步。
q = q.next;
temp = temp.next;
}
return q; // 当走到这行代码时,代表temp 和 q又相遇了,此时就是入环点。
}
}
return null; // 如果走到这里,代表链表无环直接返回null
};