# Given a list, return the node where the cycle begins. If there is no cycle, return null

https://leetcode.com/problems/linked-list-cycle-ii

Consider example `1->2->3->4->1 ` returns 1.

Consider example `1->2->3->4 ` returns null.

The problem can be solved by having slow and fast pointer.

• Increment `slow` pointer once and increment `fast` pointer twice.
• Check whether the node at `slow` and `fast` pointer is same.
• If the nodes are same, move the `slow` pointer to start of the list.
• Increment `slow` and `fast` pointer. Check the nodes, if its same return the node.

The LinkedList for the example is singly. Here is how Node class looks like:

``````class Node {
int value;
public Node next;

public Node(int value) {
this.value = value;
}
}
``````

``````public class LinkedListCycle {

public boolean hasCycle(Node head) {
if(head==null) return false;
Node slow = head;
Node fast = head;
boolean isCycle = false;
while(slow.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
if(slow == fast) {
isCycle = true;
break;
}
}
if (!isCycle)
return null;
fast = head;
while (slow != fast) {
slow = slow.next;fast = fast.next;
}
return fast;
}
}
``````