LeetCode 141.环形链表(简单)

题目描述

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

测试样例

示例1: 

b692e9a9a93d496e151231035a7b850d.png

输入:head = [3,2,0,-4], pos = 1
输出:true

示例2:

91ca182bee39b33204f729187d18f8b6.png

输入:head = [1,2], pos = 0
输出:true

示例3:

示例 3:

e8a96c07926dee52ed06fc4a67ad9510.png

输入:head = [1], pos = -1
输出:false

解析

本题可以采用Floyd判圈法来求解,Floyd判圈法可以解决的问题有:1、判断是否有环;2、计算环的长度。

具体的算法思想是采用快慢指针的思想:

1、判断是否有环

设两个指针slow和fast,初始位置都在链表的头节点处,使slow每次向后移动一步,fast每次向后移动两步,若fast在到达链表尾部前slow与fast相遇了,就说明链表有环。这也很容易想明白,假如链表没有环的话,slow是不可能追得上fast的,所以只要slow和fast相遇,就能说明链表中有环。

2、计算环的长度

同1,当判断链表中存在环之后,让fast指针再次从头节点开始,每次向后一步,slow指针也每次向后移动一步,二者再次相遇时fast指针走的长度即为环的长度。这里的原因也很简单,因为当slow和fast第一次相遇时,slow和fast必定在环上,所以只要让一者不动,另一者走一圈直到相遇,走过的节点数就是环的长度。

题解

ListNode* fast = head;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
            // 快慢指针相遇,说明有环
            if (slow == fast) 
                return true;
        }
        return false;

题目链接:https://leetcode.cn/problems/linked-list-cycle/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离~殇~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值