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

 

posted @ 2014-06-09 15:20  Marrybe  阅读(154)  评论(0编辑  收藏  举报