博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

LeetCode【142】Linked List Cycle II

Posted on 2015-05-08 15:38  NUST小文  阅读(102)  评论(0编辑  收藏  举报

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

时间复杂度为O(n)的链表环检测算法为快慢指针算法。当快慢指针相遇时,则意味着存在一个环。在检测到快慢指针指向同一节点后,将其中一个指针指向启示节点,然后将两个指针同时向后移动,两个指针再次相遇的地方就是环起始的地方。给个原理的解释:点击查看

AC代码:

ListNode* hasCycle(ListNode *head) {
    ListNode* meet = NULL;
    if(!head || !head->next)
        return NULL;
    ListNode *p1= head;
    ListNode *p2= head;
    while(p2)
    {
        if(!p2->next || !p2->next->next)
            return NULL;
        p2=p2->next->next;
        p1=p1->next;
        if(p1==p2)
        {
            meet =p1;
            return meet;
        }
    }
    return NULL;
}

ListNode *detectCycle(ListNode *head) {
    ListNode* met=hasCycle(head);
    if(!met)
    {
        cout<<"Has no circle!"<<endl;
        return NULL;    
    }
    //hasCycle and met!=NULL
    ListNode *h=head;
    while(h!=met)
    {
        h=h->next;
        met=met->next;
    }
    return h;
}

 也是感觉复杂,继续修改:

ListNode *detectCycle(ListNode *head) {
    ListNode* p1= head ,*p2= head;
    do{
        if((p2==NULL)||(p2->next == NULL))
            return NULL;
       p2 = p2->next->next;
       p1 = p1->next;
    }while(p1!=p2);
    for(p1=head;p1!=p2;p1= p1->next,p2=p2->next)
        ;
    return p1;
}