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?


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
	ListNode *detectCycle(ListNode *head) {
		if (head == NULL) return NULL;
		int len = cycleLen(head);
		if (len == 0) return NULL;

		ListNode* faster = head;
		ListNode* slower = head;

		while (len--){
			faster = faster->next;
		}

		while (faster != slower){
			faster = faster->next;
			slower = slower->next;
		}
		return slower;
	}
private:
	int cycleLen(ListNode* head){
		ListNode* faster = head;
		ListNode* slower = head;

		bool hasCycle = false;

		while (faster->next&&faster->next->next){
			faster = faster->next->next;
			slower = slower->next;
			if (faster == slower){
				hasCycle = true;
				break;
			}
		}

		if (!hasCycle) return 0;

		int len = 1;
		faster = faster->next->next;
		slower = slower->next;

		while (faster != slower){
			faster = faster->next->next;
			slower = slower->next;
			len++;
		}
		return len;
	}

};