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

 

你可能感兴趣的:(LeetCode)