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