[LeetCode OJ] Linked List Cycle II—Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
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 ListNode *p1, *p2; //p1和p2从链表的第一个节点出发,p1每次移动一个节点,p2每次移动两个节点,若两个指针重逢,则说明有环存在,否则若p2遇到NULL指针,说明无环存在 13 p1 = p2 = head; 14 15 if(p2==NULL || p2->next==NULL) 16 return NULL; 17 p1 = p1->next; 18 p2 = p2->next->next; 19 20 while(p1!=p2) 21 { 22 if(p2==NULL || p2->next==NULL) 23 return NULL; 24 p1 = p1->next; 25 p2 = p2->next->next; 26 27 } 28 //此时p1==p2,说明有环存在。利用定理:p1和p2相遇处距离链表的第一个节点的长度是环长度的整数倍,来求环起始点。让一个指针从head处开始出发,另一个指针从相遇处出发,这两个指针必然在环起始节点处相遇 29 ListNode * CircleBegin_Node; 30 p1 = head; 31 while(p1!=p2) 32 { 33 p1 = p1->next; 34 p2 = p2->next; 35 } 36 CircleBegin_Node = p1; 37 return CircleBegin_Node; 38 } 39 };