使用js解答:给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 数据范围: � ≤ 10000 n≤10000, 1 < = 结 点 值 < = 10000 1<=结点值<=10000 要求:空间复杂度 � ( 1 ) O(1),时间复杂度 � ( � ) O(n) 例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示: 可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。 输入描述: 输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表 返回值描述: 返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。 示例1 输入: {1,2},{3,4,5} 复制 返回值: 3 复制 说明: 返回环形链表入口结点,我们后台程序会打印该环形链表入口结点对应的结点值,即3 示例2 输入: {1},{} 复制 返回值: "null" 复制 说明: 没有环,返回对应编程语言的空结点,后台程序会打印"null"
时间: 2024-02-17 13:01:50 浏览: 55
约瑟夫环(一位数组 结构体 循环链表)
4星 · 用户满意度95%
以下是用 JavaScript 实现找到链表环的入口节点的代码:
```javascript
function entryNodeOfLoop(pHead) {
let slow = pHead;
let fast = pHead;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
if (slow === fast) {
let p = pHead;
while (p !== slow) {
p = p.next;
slow = slow.next;
}
return p;
}
}
return null;
}
```
具体实现思路是,用快慢指针分别从链表头开始遍历,快指针每次走两步,慢指针每次走一步,如果有环,快指针一定会追上慢指针。此时,将慢指针重新指向链表头,然后快慢指针同时每次走一步,当它们相遇的节点即为环的入口节点。这个算法的时间复杂度为 O(n),空间复杂度为 O(1)。
阅读全文