环形链表

it2025-07-10  11

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle-ii 思路:首先肯定是必须判断链表是否有环,如何判断呢?联想到快慢指针,如果链表中有环的话,则快慢指针在环中必会相遇,由此得到判断是否有环,至于入口节点该怎么判定呢?如下图所示: 如图所示有两个关键节点: 节点1: 当慢指针slow走到环的入口节点时,正好走了l步,而由于快指针的速度是慢指针的两倍,因而快指针走了2l步,距离入口节点l步,此时,慢指针在快指针前面(d - l)步。 节点2:快慢指针要想相遇的话,快指针必须追赶(d-l)步,因而会在(d-l)步相遇,此时相遇点距离入口节点刚好l步。只需要将快指针放到起始位置共同开始即可。 代码:

/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {ListNode} */ var detectCycle = function(head) { if(head === null) { return null; } let slow = head; let fast = head; let isCycle = false; while(fast.next !== null && fast.next.next !== null) { slow = slow.next; fast = fast.next.next; if(slow === fast) { isCycle = true; break; } } if(!isCycle) { return null; } else { fast = head; while(slow!==fast) { slow = slow.next; fast = fast.next; } return slow; } };
最新回复(0)