要解决如何环的入口的问题,那么首先得了解什么是环,如下图:
具体可以参考leetcode算法题里面的第141题如何判断这个链表中有环,简单来理解就是尾部节点的next指针指向了除尾部节点的链表其他节点,那么就会形成一个图形如下:
分成了除环状图形的圆结构和前面的一段,称之为环入口前段和环,有点类似于小时候玩的铁链推着铁圈如下,80后的同学应该有点感觉。
那么这个入口问题就等于是路程和速度的问题了,由于链表中每个节点的长度计算机默认是相等的,由快慢指针从头开始往后跑如果有环那么肯定就进入环中无限循环了,在学习操场400米跑过步的都能知道如果有速度差,在圆中跑那么绕圈的时候肯定有相遇的时候。那么先说结论,在慢指针1v和快指针2v的情况下,分成两种情况,第一种是有这个铁把的情况如上图,没有铁把就是尾节点指向头节点就是一开始就是个圆。那么在第一种情况下,
第二种就是相遇点就是入口。那么在快慢指针同时跑的情况下,从head开始跑
和从next和next.next开始跑最终相遇点是一样的,为了快点跑到相遇点,初始化就设置第二种,少跑几步。至于其中的数学问题,最近没空研究,就是慢指针跑铁把和从快慢指针第一次相遇的点绕圈距离最终会在入口相遇有兴趣的也可以画一下距离去测试一下,如果快慢指针比不是1:2,而是其他的1:3,1:4,可能有不同的解法。
那么最终就会在入口相遇,先记住结论吧,慢慢理解,最终代码如下。
如有不正确,有兴趣的朋友可以指正。