接上一篇『判断链表是否有环』的文章,如果链表中有环,那么该怎样找出环的入口呢?
题目描述
对于一个给定的链表,返回环的入口节点,如果没有环,返回null
问题分析
题目如果链表中有环,那么快慢指针最终会相遇,根据相遇点,可以找出环的入口节点,具体可参考下图
AC代码
function detectCycle( head ) {
// write code here
if (head == null || head.next == null) return null;
let slow = head, fast = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) break;
}
if (fast == null || fast.next == null) return null;
fast = head;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return fast;
}
总结
链表是否有环以及找出环的入口节点,最重要的是要理解为什么快慢指针可以解决,要自己推导一下推理过程,深刻理解,才算是掌握这道题目
如果这篇文章对你有帮助,请
点赞
+关注
吧 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情