【LeetCode】 环形链表Ⅱ_142

181 阅读1分钟

image.png

原题:环形链表Ⅱ

image.png 我的理解:

    **双指针法**:
    设fast为快节点,slow为慢节点。
    设x为起点的节点到入环节点的长度,
    y为慢节点从入环节点到相遇节点的长度,
    z为快节点环内比慢节点多走的长度。
    其中fast节点的路程是slow节点两倍
    由题意:
    x + y = n
    x + y +z + y = 2n
    两式结合得:z = x
    
    从这个相遇的节点继续往前走到成环点的距离等于从头结点 到达成环点 的距离,
    那么最简单的方法从入环 和 相遇点同时两个指针往前走,每次移动一步,
    相遇的那个点就是成环的点。


image.png

    class LinkNode {
        constructor(val, next) {
            this.next = next;
            this.val = val;

        }
    };
    var MyLinkedList = function () {
        this._size = 0;
        this._head = null;
    };
    MyLinkedList.prototype.detectCycle = function (head) {
        
        var dummy = new LinkNode(0,head);
        var fast = dummy,slow = dummy;
        while(fast !== null && fast.next !== null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow ===fast){
                var index1 = fast;
                var index2 = dummy;
                while(index1 !== index2){
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }