142.环形链表ll

60 阅读1分钟

思路

a:表头到入环点,不包含入环点

b:环的长度,包含入环点

1.第一次相遇,p2 = nb

2.a+nb === 入环点

3.p1 = head 再走a步就到入环点

4.由上面条件得出,起始距离入口 = a + 第一次相遇位置(nb)

代码

var detectCycle = function(head) {
    if (head === null) {
        return null;
    }
    let p1 = head, p2 = head;
    while (p2 && p2.next) {
        p1 = p1.next;
        p2 = p2.next.next;
        if (p2 === p1) {
             p1 = head;
            while (p1 !== p2) {
                p1 = p1.next;
                p2 = p2.next;
            }
            return p1;
        }
    }
    return null;
};

复杂度

时间:O(n)

空间: O(1)