找到环形链表的第一个节点

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点, 也就是 需要返回的节点

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。