www.cnblogs.com/kyoner/p/11… 文章是在这里看的,是在下愚昧,好不容易才想明白,说下我的思路 代码就用他的了
ListNode fast, slow;
fast = slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow)
break;
}
slow = head;
while (slow != fast) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
开始我比较难理解的就是 假设slow走了K步 fast走了2k步,头结点到环的起点的距离为n,环的起点到相遇点的距离为m,两指针相遇,得出结论环的长度为k,我就在想环小点,slow不是就走了不止一圈, 下一秒就被自己蠢到了,如果走了不止一圈,那岂不是早都相遇了,所以n+m<k不成立,即n+m>k,肯定是slow环的一圈还没走完,然后能相遇只能是fast走完一圈环追上slow,所以这样环的长度就为k,这时两个指针顺时针(逆时针也一样)距离环的起点就有k-m,这时让两指针的速度统一为slow的速度,把一个放在刚才相遇的点,另一个放在头结点,那么他们下一次相遇的地方就是环的起点,用纸画一下应该更清楚。