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 };