设slow从head走到环起始点a步, 从head走到相遇点走了b步, 环长c步 设fast比slow多走了k圈, 2b - b = kc => b = kc; slow在环中走了b - a步, 即走了kc - a步, 所以slow再走a步就能到达环起点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } }
public class Solution {
public ListNode detectCycle(ListNode head) { ListNode slow = head, fast = head; while (fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; if (slow == fast) break; } if (fast == null || fast.next == null) return null; while (head != slow) { head = head.next; slow = slow.next; } return head; } }
|