给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

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


示例 2:

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


示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

思路:快慢指针法

两个指针从头开始遍历,快指针每次走两步,慢指针每次走两步

设慢指针走了n步,快指针就走了2n,每次的差距为n步,所以如果有环,快慢指针总会相遇

我们将慢指针的移动过程划分为两个阶段:非环部分与环形部分:

1. 慢指针在走完非环部分阶段后将进入环形部分:此时,快指针已经进入环中,非环部分长度=N

2. 两个指针都在环形区域中:考虑两个在环形赛道上的运动员 - 快跑者每次移动两步而慢跑者每次只移动一步。其速度的差值为 1
​    因此,在最糟糕的情形下,时间复杂度为 O(N+K),也就是 O(n)。

刚开始还考虑过会不会快的每次两步,如何跳过慢指针,后来仔细一想,发现不是这样的,因为慢指针也在移动

通俗点可以理解为他们的相对速度只差一个格子,快的只能一个一个格子的去追慢的,必然在一个格子相遇。

如果没看懂,看下面的详细。
一次跳2个与一次跳一个格子的追上之后,是一定会在一个格子遇到的。因为在即将追上的时候,快的那个落后慢的1个或者2个格子,无论哪种,落后1个的话,下一步正好追上,落后2个格子的话,下一步就落后1个格子了,也可以说即将追上的时候一定是相差1个格子,下一步一定在一个格子相遇。

提交的代码:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null||head.next==null)
        {
            return false;
        }
        ListNode slow,fast;
        slow = head;
        fast = head.next;
        while(slow!=fast)
        {
            if(fast.next==null||fast.next.next==null)
            {
                return false;
            }
            slow = slow.next;
            fast = fast.next.next;
        }
        return true;
    }
}

Leetcode--141. 环形链表相关推荐

  1. LeetCode 141. 环形链表 简单难度

    ** 141. 环形链表 ** 给定一个链表,判断链表中是否有环. 如果链表中存在环,则返回 true . 否则,返回 false . 解题思路(两种方法): 方法一:用集合set以及set.find ...

  2. LeetCode - 141. 环形链表

    141. 环形链表 import java.util.Objects;class ListNode {int val;ListNode next;ListNode(int x) {val = x;ne ...

  3. LeetCode 141. 环形链表

    原题链接 解题思路:快慢指针,如果快指针被慢指针追上一定是环形链表 /*** Definition for singly-linked list.* struct ListNode {* int va ...

  4. leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题

    ⭐️ 环形链表 I 题目描述 给你一个链表的头节点 head ,判断链表中是否有环.如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 如果链表中存在环 ,则返回 tru ...

  5. Leetcode 141.环形链表

    难度:简单 频率:155 题目: 给你一个链表的头节点head,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环.为了表示给定链表中的环,评测系统内部使 ...

  6. leetcode - 141. 环形链表(哈希表)

    给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...

  7. 32. Leetcode 141. 环形链表 (链表-双指针-环形链表)

    给你一个链表的头节点 head ,判断链表中是否有环.如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表 ...

  8. Leetcode 141.环形链表 (每日一题 20210617)

    给定一个链表,判断链表中是否有环.如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 ...

  9. [leetcode] 141.环形链表

    给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引 ...

  10. Leetcode 141. 环形链表 解题思路及C++实现

    解题思路: 定义快慢两个指针,当指针所指节点是同一个时,说明出现了环. /*** Definition for singly-linked list.* struct ListNode {* int ...

最新文章

  1. IO多路复用的三种机制Select,Poll,Epoll
  2. 项目管理其实可以简单一点——任务分工
  3. EditText 输入类型 android:inputType=quot;参数类型quot;
  4. 前端学习(512):两列布局的第一种方式的优缺点
  5. 李国庆深夜发“15条真相”回应:关于原生家庭、同性恋、1.3亿...
  6. win7关机快捷键_win7电脑键盘关机的操作方法
  7. [转载] python怎么将十进制转换为二进制_python十进制和二进制的转换方法(含浮点数)
  8. Class.isAssignableFrom instanceof 区别
  9. python3 使用冒泡排序法原理解析,简单易懂
  10. Deep Learning for Image and Point Cloud Fusionin Autonomous Driving: A Review
  11. leapftp连接不上,为什么leapftp连接不上
  12. Algorithms-3.2 Binary Search Trees 二叉查找树
  13. Java - 批量生成二维码压缩包
  14. 2017年11月19日实验感想
  15. 读书百客:《十一月四日风雨大作》评赏
  16. 生物医学数据大爆炸,大数据“挖掘机”哪家强?
  17. 关于Vue和Yii的作者国籍
  18. BES(恒玄) 平台 复杂按键 实现
  19. 大数据导论三——大数据技术
  20. JS 键盘事件、触摸事件

热门文章

  1. 二叉排序树删除子节点以及遍历
  2. css3案例分析,CSS3动画/动画库以及案例分析(上)
  3. Linux系统服务器停服,Linux系统服务启动和停止
  4. java listview控件_ListView普通列表控件的使用
  5. 知识图谱入门视频(二)
  6. Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅
  7. 从Java程序员进阶到架构师,6大核心技能要领详解
  8. 论文浅尝 - ISWC2020 | KnowlyBERT: 知识图谱结合语言模型补全图谱查询
  9. 使用numpy实现神经网络模块
  10. 2020国内互联网公司的开源项目及Github地址部分汇总