zoukankan      html  css  js  c++  java
  • LeetCode【142】Linked List Cycle II

    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;
    }
  • 相关阅读:
    AWR介绍使用
    hint使用
    部分索引类型介绍\索引重建否\索引压缩
    生成Oracle Statpack步骤
    自治事务
    append与nologging的使用
    聚簇表
    C语言杂谈——静态函数
    Qt之对话框设计——可扩展对话框
    C语言杂谈——指针篇
  • 原文地址:https://www.cnblogs.com/ww-jin/p/4487872.html
Copyright © 2011-2022 走看看