LeetCode 环形链表2
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
快慢双指针找出环和环大小
快慢指针第一次相遇时,慢指针的迭代次数是环大小的整数倍。所以环的大小以第二次快慢指针相遇时慢指针的迭代次数为准。
while(cur2!=NULL&&cur2->next!=NULL && cur1->next!=NULL && (cur1->next)->next!=NULL &&temp<2)
{
cur1=(cur1->next)->next;
cur2=cur2->next;
if(temp==1)count++;//环大小
if(cur1==cur2)
temp++;
}//比较菜,有一堆判断
将环不断旋转,用另一个指针从头遍历,不断碰撞旋转的环
while (true){
for(int i=0;i<count;i++)
{
if(cur3==cur2)
return cur3;
cur2=cur2->next;
}
cur3=cur3->next;
}
/**
* 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) {
ListNode *cur1=head;
ListNode *cur2=head;
ListNode *cur3=head;
int count=0;
int temp=0;
while(cur2!=NULL&&cur2->next!=NULL && cur1->next!=NULL && (cur1->next)->next!=NULL &&temp<2)
{
cur1=(cur1->next)->next;
cur2=cur2->next;
if(temp==1)count++;
if(cur1==cur2)
temp++;
}
if(temp==0)
return NULL;
while (true){
for(int i=0;i<count;i++)
{
if(cur3==cur2)
return cur3;
cur2=cur2->next;
}
cur3=cur3->next;
}
return NULL;
}
};