每日刷题 day04---判断链表是否有环

103 阅读1分钟

第一种方法: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
    }