demo : 3 2 0 4 2 0 4 2 0 4 环形链表 3204 204为环
检测 3204是否为环, 然后找到入环的第一个节点
findCircleFirstNode(head){
let s = f = cur = head;
while( f && f.next ){
f = f.next.next;
s = s.next;
if(f === s){
while( cur !== s ){
cur = cur.next;
s = s.next // 这是个数学的点... 暂时用结果推论 过程
}
return cur
}
return null
}
}
*** 思路 *** s = s.next
假设整段路程为 x c 两个部分构成
x为 距离环起始点的距离,
c为 环的长度
单位移动速度 为 a
慢节点s a
快节点f 2a
环形起始点 begin
因为 不确定 s f 是否会在 正好在 begin 相遇 所以定begin 与 相遇点距离 y ( 外圈不是内圈 )
s与f 相遇的最终移动距离
所以最终推导的式子是
- slow => x + c - y
fast => x + c + c - y
当这两个分别移动了 上述距离时候相遇
slow => a ; fast => 2a
fast 比 slow 多跑了a的距离 ( 有点抽象, 就是 一倍的距离 )
x + c - y = a
x + 2c - y = 2a
最终得出 c = a;
代入式子 得出 x = y 起点 距离 begin点的位置 === 外圈y的距离
所以
最终会有
s = s.next;
cur = cur.next;
s === cur 时候就是正好为begin点, 也就是 需要返回的节点