判断链表是否有环
原题连接: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;
}
};