【leetcode 刷题日记】09-环形链表(C++快慢指针)

141.环形链表

题目

给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
这里的pos和解题没啥关系,是leetcode测试用的。

示例

示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

思路

这个题目的pos写的很迷惑哈哈,还以为链表给了末尾结点的值呢,如果pos等于-1就无环,其他值就有环。写完发现不对才看的题解,原来题目的意思就是让判断是不是有环的链表。
这里发现了一个很有意思的思路,即快慢指针
假设有快慢两个运动员,快的运动员一次跑两步,慢的运动员一次跑一步,如果跑道是圆环的,那么第二圈的时候一定会相遇,如果是直线的就不会相遇。以两个运动员是否相遇作为有环和无环的判断条件。

代码

/**
 * Definition for singly-linked list.
 * 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* fast{ head };//快指针
        ListNode* slow{ head };//慢指针
        while(fast->next!=NULL&&fast->next->next!=NULL)
        {
            fast=fast->next->next;//快的运动员一次跑两步
            slow=slow->next;//慢的运动员一次跑一步
            if(fast==slow)//如果相遇代表有环
            return true;
        }
        return false;
    }
};

提交记录

昨天说的要开始看论文了,可惜今天学校云开课有五节课,还要改师兄的论文图,感觉是没时间看论文了。有想法把看论文的笔记也放在csdn上更新,编辑起来还是比较方便的。

发布了34 篇原创文章 · 获赞 24 · 访问量 2021

猜你喜欢

转载自blog.csdn.net/fengshiyu1997/article/details/104754791
今日推荐