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<stdio.h>
#include<stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
}*ListNode;
ListNode* detectCycle(ListNode *head) {
ListNode *p1,*p2,*p3;
int n,m,flag;
if(head==NULL||head->next==NULL) return NULL;
if(head->next==head) return head;
for(p1=p2=head;p1!=NULL&&p1->next!=NULL;){
p1=p1->next->next;
p2=p2->next;
if(p1==p2) break;
}
if(p1==NULL || p1->next==NULL) return NULL;
n=1;
while(p1->next!=p2){
p1=p1->next;
n++;
}
for(p1=head; p1!=p2; p1=p1->next){
for(p3=p1, m=0, flag=0; p3->next!=p1 && m<=n; p3=p3->next){
if(p3==p2) flag=1;
if(flag==1) m++;
}
if(p3->next==p1) return p1;
}
return p2;
}