//方法一:
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *slow = head;
struct ListNode *fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
struct ListNode *meet = fast;
while(head != meet)
{
head = head->next;
meet = meet->next;
}
return meet;
}
}
return NULL;
}
#include <math.h>
//方法二:
struct ListNode* getIntersectionNode(struct ListNode* meetNew,struct ListNode* head)
{
struct ListNode* Nmeetnew = meetNew;
struct ListNode* Nhead = head;
int count1 = 1;
int count2 = 1;
while(Nmeetnew->next)
{
Nmeetnew = Nmeetnew->next;
count1++;
}
while(Nhead->next)
{
Nhead = Nhead->next;
count2++;
}
int gap = abs(count1-count2);
struct ListNode* longlist = meetNew;
struct ListNode* shortlist = head;
if(count1 < count2)
{
longlist = head;
shortlist = meetNew;
}
while(gap--)
{
longlist = longlist->next;
}
while(longlist != shortlist)
{
longlist = longlist->next;
shortlist = shortlist->next;
}
return longlist;
}
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *slow = head;
struct ListNode *fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
struct ListNode *meetNew = fast->next;
fast->next = NULL;
return getIntersectionNode(meetNew,head);
}
}
return NULL;
}