第一种方法:set
利用set是无序且不存在重复元素的数据集合的特性,当链表中存在环的时候,一定会存在某一元素.next已经在set中,不存在的话,就是没有环
代码 时间复杂度O(n) 空间复杂度O(n)
function hasCycle(root){
let set = new Set()
while(root){
if(set.has(root)){
return true
}else{
set.add(root)
root = root.next
}
}
return false
}
第二种方法:双指针 事件复杂度O(n)空间复杂度 O(1)
就是有两个指针,慢指针一次走1步,块指针一次走两步,快慢指针相遇的话,说明存在环
function hasCycle2(root){
if(root == null || root.next == null){
return false
}
let fast = root
let low = root
while(fast.next !=null && low != null){
fast = fast.next.next
low = low.next
if(fast === low){
return true
}
}
return false
}