Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up:
Can you solve it without using extra space?
If there is a cycle, use the head of the list to chase after the walker, the point where they meet is the required node.
/**
* 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) {
if (head == null) {
return null;
}
ListNode walker, runner;
walker = runner = head;
while (walker.next != null && runner.next != null && runner.next.next != null) {
walker = walker.next;
runner = runner.next.next;
if (walker == runner) {
while (head != walker) {
head = head.next;
walker = walker.next;
}
return head;
}
}
return null;
}
}