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;
    }
  • 相关阅读:
    用python写一个北京市的个税计算器
    排序算法(冒泡、选择)-python代码展示
    封装系统内置功能的函数(字符串)
    福彩习题
    打印等腰三角形
    1.冒泡排序法
    腾讯云:搭建 Node.js 环境
    python开发环境搭建
    基于 Ubuntu 搭建 FTP 文件服务
    TensorFlow — 相关 API
  • 原文地址:https://www.cnblogs.com/ww-jin/p/4487872.html
Copyright © 2011-2022 走看看