Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
Note: Do not modify the linked list.
Follow up:
Can you solve it without using extra space?
1 /**
2 * Definition for singly-linked list.
3 * struct ListNode {
4 * int val;
5 * ListNode *next;
6 * ListNode(int x) : val(x), next(NULL) {}
7 * };
8 */
9 class Solution {
10 public:
11 ListNode *detectCycle(ListNode *head) {
12 if(head == NULL || head->next == NULL){
13 return NULL;
14 }
15
16 ListNode* slow = head;
17 ListNode* fast = head;
18
19 while(fast->next != NULL && fast->next->next != NULL){
20 fast = fast->next->next;
21 slow = slow->next;
22
23 if(fast == slow){
24 slow = head;
25
26 while(slow != fast){
27 slow = slow->next;
28 fast = fast->next;
29 }
30
31 return slow;
32 }
33 }
34 return NULL;
35 }
36 };