[路飞]-leetcode142 环形链表

177 阅读2分钟

我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

回顾

我们回顾一下141 链表中是否有环。

思路一 :hash表

我们通过hash表来存储遍历过的值,如果遍历的值在hash表里存在了就说明链表里有环,跳出循环,否则循环结束时,返回false,说明链表无环。

var hasCycle = function(head) {
    let cur = head, table = new Set()
    while(cur){
        if(table.has(cur))return true
        table.add(cur)
        cur = cur.next
    }
    return false
};

思路二 :快慢指针

我们通过slow , fast快慢指针,slow走一步,fast走两步,当slow==fast,节点相遇,说明有环,否则没有。

var hasCycle = function(head) {
    let slow = head, fast = head // 声明快慢指针
    while(fast && fast.next){
        if(slow == fast)return true // 指针相遇了表示有环
        slow = slow.next
        fast = fast.next.next // 判断fast.next存在的原因是 fast走两步,防止fast.next为空报错
        
    }
    return false
};

142. 环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。

不允许修改 链表。

这里同样遵循141的解法

思路一 :hash表

我们通过hash表来存储遍历过的值,如果遍历的值在hash表里存在了就说明这里是入环的起始点,并返回这个节点,跳出循环。否则循环结束时,返回null,说明链表无环。

var detectCycle = function(head) {
    let cur = head, table = new Set()
    while(cur){
        if(table.has(cur))return cur
        table.add(cur)
        cur = cur.next
    }
    return null
};

思路二 :快慢指针

我们通过slow , fast快慢指针,slow走一步,fast走两步,当slow==fast,节点相遇

这里我们需要看一张图

image.png

var detectCycle = function(head) {
    let slow = head, fast = head // 声明快慢指针
    while(fast && fast.next){
        
        slow = slow.next
        fast = fast.next.next // 判断fast.next存在的原因是 fast走两步,防止fast.next为空报错
        if(slow == fast) {// 指针相遇了表示有环
            let start = head
            while(slow != start){
               start = start.next
               slow = slow.next
            }
            return slow
        }
    }
    return null // 无环则返回null
};

结束语

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~