Leetcode - 环形链表
2020-04-12 本文已影响0人
小遁哥

给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

测试数据如下
let l2 = {
val: 1,
next: null,
};
l2.next = {
val: 2,
next: {
val: 3,
next: {
val: 4,
next: l2,
},
},
};

我有想到递归,但发现结束条件没法弄...
var hasCycle = function(head) {
if (head === null) {
return false;
}
let arr = [];
while (head !== null) {
if (arr.includes(head)) {
return true;
}
arr.push(head);
head = head.next;
}
return false;
};
没啥好说的,就是多用了些内存,空间复杂度为O(n)

var hasCycle = function (head) {
let slow = fast = head
while (slow && fast && fast.next) {
slow = slow.next
fast = fast.next.next
if (slow === fast) {
return true
}
}
return false
};
流程如下:
第一次: slow
为 2,fast
为 3
第二次: slow
为 3,fast
为 1 (已经到了入环口)
第三次: slow
为 4,fast
为 3
第四次: slow
为 1,fast
为 1
O(1)
的空间复杂度

送大家一个入口处不在起始节点的测试数据
let l3 = {
val: 1,
};
let l5 = {
val: 5,
};
l3.next = l5;
l5.next = l3;
let l2 = {
val: 2,
next: {
val: 3,
next: {
val: 4,
next: l3,
},
},
};

我在想如何利用数学推导出可行性,有些文章用跑步举例,我觉得不准确。
如何证明一定会停在同一个地方,而不是超过呢,如果总是超过就陷入死循环了
我自己在本子上推算了半天也没搞明白,看了一些推理的文章也没看懂,看来需要小姐姐当面给我讲一下子,我现在是不行了,感觉智商为0了
还有求入口处的算法...