算法题-给定一个链表,判断链表中是否有环

189 阅读1分钟

题目:给定一个链表,判断链表中是否有环。

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
};

对于第二种方法还是有些疑惑,贴出来希望还能被各位大佬抢救一下