142. 环形链表 II
题目描述:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
解决思路:快慢指针法
使用两个指针,slow指针和fast指针。slow指针每次向后移动一步,fast指针每次向后移动两步。如果链表有环,两指针会在环中再次相遇。
如下图所示:
-
假设链表起点到开始入环的第一个节点的距离是a,当slow指针走到开始入环的第一个节点时,走了a步,则fast指针走了2a步,此时fast指针到开始入环的第一个节点的距离设为x,则环的长度为a+x。
-
当slow指针走了x步,fast指针走了2x步,两指针再次相遇。此时,两指针距离开始入环的第一个节点的距离为a跟链表起始点到入环节点距离a是相等的。
-
所以,此时可以使用start指针指向头指针,start指针每次向后移动一步,slow指针也继续每次向后移动一步。当它们走了a步后相遇点就是开始入环的第一个节点即该题所求节点。
/**
* @param {ListNode} head
* @return {ListNode}
*/
var detectCycle = function(head) {
if(head == null) return null;
//p,q 一定要在同一起跑线上
let p = head, q = head;
while(q != null && q.next != null) {
p = p.next;
q = q.next.next;
if(p == q) {
let k = head;
while(k != p) {
k = k.next;
p = p.next;
}
return k;
}
}
return null;
};
自述
算法小白一个,记录自己的算法学习之路。如果您发现问题,欢迎留言交流。