leetcode-142-环形链表Ⅱ

77 阅读1分钟

image.png

leetcode原题

解题方法一

使用Set/Map记录每个节点,然后while遍历使用Set/Map.has方法判断否存在当前节点,如果存在重复的节点,这个节点就是入环节点

var detectCycle = function(head) {
    const record = new Set()
    while(head) {
        if (record.has(head)) return head
        
        record.add(head)
        head = head.next
    }
    return null
}

解题方法二

慢指针移动两步,快指针移动一步,相遇之后,快指针变成头指针,然后每次快慢指针各走一步直到相遇,相遇的节点就是入环节点

var detectCycle = function(head) {
    if (head === null) {
        return null
    }
    let slow = head, fast = head
    while (fast !== null) {
        slow = slow.next //慢指针移动两步,快指针移动一步
        if (fast.next !== null) {
            fast = fast.next.next
        } else {
            return null //如果没有环 之间返回null
        }
        if (fast === slow) {//有环
            let fast = head
          	//快指针指向头节点,然后每次快慢指针各走一步直到相遇,相遇的节点就是入环节点
            while (fast !== slow) {
                fast = fast.next
                slow = slow.next
            }
            return fast
        }
    }
    return null
}