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