判断链表是否有环

原题连接:https://leetcode-cn.com/problems/linked-list-cycle/description/

我最开始的方法是牺牲空间节约时间(然而是两个都为我的智商白白牺牲了);利用vector存储节点地址,然后遍历链表,利用find函数查找有没有相同的地址;提交之后通过是通过了,但是时间和空间都因为我的智商白白牺牲了。不甘心。不看别人的代码;继续想

想到,我干脆释放内存吧,只要释放出错就是有环了。那么怎么捕捉这个错误呢?这时候就要面向谷歌编程了,发现要用到信号,哎,信号我学过啊,一看,和Linux下的差不多啊。心里一阵窃喜,但是随即抽自己两巴掌,MD,不就是上环嘛,还要用信号捕捉?心灰意冷,还是看别人的代码吧,点开一看,细细一想,顿时惊为天人——我看不懂。哎卧槽,脑子不够用了,用笔代替一下吧,经过我的运算,嗯,,,想出这个方法的人甚叼;简单来说就是有两个人,一个跑得快,一个跑得慢,快的那个人的速度是慢的那个人的两倍,他们从同一个地方跑,如果是直线(无环),那他俩是碰不到一起了,如果转圈(有环),那这俩肯定能碰面啊,一碰面不就是有环了嘛,真是贼聪明;得劲!

---------------------------------------------------------------------------------------------------犹豫着要不要贴我的代码--------------------------------------------------------------------------------------------------------------

不上代码的博客都是耍流氓;我就只贴我的吧,大神的代码就不贴了,免得脏了大神的代码;

static int x = []() {

    ios::sync_with_stdio(false);    // cin与stdin禁止同步

    cin.tie(NULL);                   //cin与cout解除绑定

    return 0;

}();

class Solution {

public:

    bool hasCycle(ListNode *head) {

         if (head == NULL || head->next == NULL)

         {

             return false;

         }

         vector<ListNode*>temp;

         ListNode *before = head, *after = head->next;

         temp.push_back(before);

         while (after)

         {

             before = after;

             after = after->next;

             if (temp.end() == find(temp.begin(), temp.end(), before))

             {

                  temp.push_back(before);

                  continue;

             }

             else

             {

                  return true;

             }

         }

         return false;

    }

};

猜你喜欢

转载自www.cnblogs.com/love-DanDan/p/9158812.html