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;
    }
  • 相关阅读:
    数组 滑动窗口
    爬虫案例 下载某文库付费文档 全格式
    双指针 三数之和
    双指针 四数之和
    双指针法 环形链表 II
    判断是否手机端
    C# 模拟点击
    chrome 扩展开发注意事项
    破解拖动验 证码
    //刷新任务栏图标 终止别的进程序有些程序有托盘会残留
  • 原文地址:https://www.cnblogs.com/ww-jin/p/4487872.html
Copyright © 2011-2022 走看看