基本思路是 : 设置两个前后指针 , 前指针每次前进2 , 后指针每次前进1 , 如果存在一个环 , 必然会在某个时刻前指针追上后指针 , 如果不存在环 , 则前指针碰到末尾就直接结束了(到这里是检测是否存在一个环)
ListNode fast,slow;
fast = slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow)
break;
}
if(fast == null || fast.next == null)
return null;
上述如果不存在则会返回null , 如果存在则继续下一步
因为2个指针从同一个节点同时出发的 , 在存在环的情况下 , 当两个指针相遇时 ,
设后指针速度为v , 经历时间为t , 则前指针速度为2v , 时间为t , 将所有路程分成3段 , 第一段是在环外的路程s1 (这段路程2个指针都要经历) , 第二段是后指针在环内经历的路程s2 , 第三段为后指针在环内未走完整个环的路程s3
v * t = s1 + s2;
2 * v * t = s1 + s2 + s3 + s2;
两式相减可以知道 , s1 = s3
也就是说共同路段(s1) = 后指针在环内未走完的路程
那么从起始点 , 相遇点同时出发 , 一个点一个点走过去 , 最后肯定会在环的起始点相遇
slow = head;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return fast;