• [LeetCode] Linked List Cycle


    Given a linked list, determine if it has a cycle in it.

    Follow up: Can you solve it without using extra space?

    "Time Limit Exceeded"费时间的方法如下:查看p结点与它之前的结点t是否有连接;p往前挪一个结点,则t都要从head开始遍历到p。

    struct ListNode {
          int val;
          ListNode *next;
          ListNode(int x) : val(x), next(NULL) {}
      };
    class Solution {
    public:
        bool hasCycle(ListNode *head)
        {
            if(head == NULL)
                return false;
            ListNode *p = head;
            while(p != NULL)
            {
                if(p->next == p)
                    return true;
                
                ListNode *t = head;
                while(t != p)   
                {
                  if(p->next == t)
                      return true;
                  else
                      t = t->next;
                }
               p = p->next;
             }
            return false;
         }
    };


    Accept的方法如下:指针p每次往前走2步,指针t每次往前走1步,如果有循环,则p总会与t在第二圈相遇,虽然相遇点不一定是环的循环连接点。

    class Solution {
    public:
        bool hasCycle(ListNode *head)
        {
            if(head == NULL)
                return false;
            ListNode *p = head,*t=head;
    
            while(p!=NULL)
            {   
                if(p->next != NULL )//判断是否到达末点或者是否存在自循环。
                {
                    if( p==p->next)
                        return true;
                }
                else
                    return false;
                    p = p->next;
                    if(p == t)
                    return true;
                
    
                if(p->next != NULL ) //判断是否到达末点或者是否存在自循环。
                {
                    if( p==p->next)
                        return true;
                }
                else
                    return false;
            
                     p=p->next;
                    if(p == t)
                        return true;
                t = t->next;
            }
         }
    };

    还有一种使用set<ListNode *>来记录每个结点的指针,然后p开始单步走,判断结点如果已经存在set里,表明有循环。但此种方法使用的空间是O(n),超出要求:

    class Solution {
    public:
        bool hasCycle(ListNode *head)
        {
            ListNode *p = head;
            set<ListNode *> s;
            while(p!=NULL)
            {
             if(s.count(p))
                 return true;
             else
               s.insert(p);
            
              p = p->next;
            }
            return false;
    
         }
    };

    set无处不在,很多问题可以很方便的解决,就是用的空间不满足此题的要求。

  • 相关阅读:
    列表 list
    flask实现json数据处理、学生信息表格展示和jinjia2的用法
    flask实现用户登录和上传文件
    移动端APP测试
    charles-截取移动端请求-设置代理
    charles-过滤网络请求方法
    badboy的录制和jmeter的使用
    jmeter之关联
    jmeter集合点
    jmeter之检查点
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3783024.html
Copyright © 2020-2023  润新知