Linked List Cycle II

来源:互联网 发布:迅雷 for mac 老版本 编辑:程序博客网 时间:2024/06/02 06:25

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


0 0