leetcode找循环链表的循环点

来源:互联网 发布:doodle jump java 编辑:程序博客网 时间:2024/05/21 10:12

这个题画图就可以分析出:

一个快指针,一个慢指针,如果有循环必定相遇。

假设起点到循环点长度为a,相遇点到循环点长度为b,循环剩下长度为c。

则很容易得到:

2*(a+b)==a+b+n*(b+c);

变形得:

a=(n-1)*(b+c)+c;

可以得出,再次另一个指针指向链表头,和相遇点指针同速前进,必定在循环点相遇。

具体代码如下:

class Solution {public:    ListNode *detectCycle(ListNode *head) {        if(head==NULL)            return 0;        ListNode *slow=head,*fast=head;       while(fast!=NULL&&fast->next!=NULL){            slow=slow->next;            fast=fast->next->next;            if(slow==fast)                break;        }        if(fast==NULL||fast->next==NULL)            return NULL;        slow=head;        while(slow!=fast){            fast=fast->next;            slow=slow->next;        }        return slow;    }};


0 0