本文共 811 字,大约阅读时间需要 2 分钟。
思路:双指针跑圈,跑到有圈的时候快指针停止,重新做一个指针从头开始,跟慢指针一样以一次一步的速度跑,跑到相同时返回,因为多余的长度L等于圈长M的倍数+慢指正回到起点的步数。
快指针速度:2,慢指针速度:1
多余长度:L
圈长:M
快慢指针相遇时间:T
相遇地点距离圈起始位置:N
2T=L+X*M+N;
T=L+Y*M+N;
=>
T=(X-Y)*M;
=>
L=(X-2Y)*M-N;
即结论。
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode detectCycle(ListNode head) { ListNode fast=head; ListNode slow=head; while (true) { if (fast==null||fast.next==null) { return null; } fast=fast.next.next; slow=slow.next; if (fast==slow) { ListNode again=head; while (true) { if (slow==again) { return again; }else { slow=slow.next; again=again.next; } } } } }}
耗时:308ms,中游。