题目:给定一个链表,判断链表中是否有环。
leecode链接:leetcode-cn.com/problems/li…
解题思路
用一快一慢两个指针遍历链表,如果指针能够相逢,那么链表中就有圈
解题步骤
1.用一快一慢两个指针遍历链表,如果能够相逢,返回true 2.遍历结束后还没有相逢就返回false
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let p1 = head
let p2 = head
while(p1 && p2 && p2.next){
p1 = p1.next
p2 = p2.next.next
if(p1 === p2){
return true
}
}
return false
};
时间复杂度和空间复杂度
时间复杂度:O(n)
空间复杂度:O(1)
另外一种解题方法
用set实现了另一种方法,但是该方法在leecode上无法提交,原因是链表特别长的时候会超时:
var hasCycle = function(head) {
let p1 = head
let set = new Set()
while(p1){
if(set.has(p1)){
return true
}
set.add(p1)
p1 = p1.next
console.log(set)
}
return false
};
对于第二种方法还是有些疑惑,贴出来希望还能被各位大佬抢救一下