141题:环形链表
方法一:数组
思路: 1. 遍历每个值,每个值及每个值的.next 不能为null 2. 把每一项值与数组中的值进行对比是否相等,有相等的返回true,说明是环形链表;否则把该值存入数组中
复杂度: 时间复杂度:O(n^2) 空间复杂度:O(n)
代码:
var hasCycle = function(head) {
let p = head
let stack = []
while(p && p.next){
for(let i = 0;i<stack.length;i++){
if(stack[i] == p){
return true
}
}
stack.push(p)
p=p.next
}
return false
};
方法二: 快慢指针
原理: 龟兔赛跑原理(快慢指针原理)
众所周知,🐰比🐢跑的慢,他们位于同一起跑点开始跑,如果不是环形链表,那么🐰永远在🐢前面。如果是环形链表,那么当🐰领先🐢很多圈的时候,某一点🐰和🐢会相遇。那么在这一点判断值是否相等,相等则为环形链表。也称为快慢指针,定义两个指针,一个是快指针代表🐰,一个是慢指针🐢。
复杂度: 时间复杂度:O(n) 空间复杂度: O(1)
代码:
var hasCycle = function(head){
let slow = head
let fast = head
while(fast && fast.next){
slow = slow.next
fast = fast.next.next
if(slow === fast){
return true
}
}
return false
}