Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Follow up:
Can you solve it without using extra space?
设定两个指针,一个指针在前面,一个指针在后面。如果后面的指针一直小于前面的指针,那么就没有循环;
如果后面的指针超过前面的指针,那么就存在循环
#include<iostream>
using namespace std;
struct ListNode{
int val;
ListNode * next;
ListNode(int x):val(x),next(NULL){ };
};
class Solution{
public:
Solution(){ };//constructor;
ListNode * detectCycle(ListNode *head){
ListNode * pre;
ListNode * post;
if(head==NULL || head->next==NULL)
return NULL;
pre=head;post=head->next;
while(pre<post){
post=post->next;
pre=pre->next;
if(post==NULL)
return NULL;
}return post;
}
};
int main(){
ListNode a=ListNode(-1);
ListNode b=ListNode(-7);
ListNode c=ListNode(7);
ListNode d=ListNode(-4);
ListNode e=ListNode(19);
ListNode f=ListNode(6);
ListNode g=ListNode(-9);
ListNode h=ListNode(-5);
ListNode i=ListNode(-2);
a.next=&b;b.next=&c;c.next=&d;d.next=&e;
e.next=&f;f.next=&g;g.next=&h;h.next=&i;i.next=&h;
Solution sol;
ListNode * temp=sol.detectCycle(&a);
cout<<temp->val<<endl;
// cout<<(temp==NULL)<<endl;
}