一、题目

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

为了表示给定链表中的环,我们使用整数 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)(即,常量)内存解决此问题吗?

二、题解

  • 解法1:哈希表

遍历所有节点并把每个节点的引用存储到哈希表中。如果当前节点的引用已经存在于哈希表中,说明该链表是环形链表,返回 true;反之,则遍历到尾,即该节点的下一个节点为 null,该链表不是环形链表,返回 false。

时间复杂度:O(n),空间复杂度:O(n)。

function hasCycle($head) {
$hashMap = [];
$curr = $head;
while ($curr != null && $curr->next != null) {
if (in_array($curr, $hashMap)) {
return true;
}
$hashMap[] = $curr;
$curr = $curr->next;
}
return false;
}
  • 解法2:双指针——快慢指针

快指针:一次两步

慢指针:一次一步

假设一个环形赛道,两个运动员 A 和 B,A 领先 B 一步:

在一个圆里,速度快的 A 在跑了 n 圈后,一定能遇到速度慢的 B

——对应链表,就是两个指针重合

如果不是圆,速度快的 A 一定先到达终点,则说明不存在环

——对应链表,就是结尾指针指向null

时间复杂度:O(n),空间复杂度:O(1)。

function hasCycle($head) {
if ($head == null || $head->next == null) {
return false;
}
//快慢指针
$slow = $head;
$fast = $head->next;
while ($slow != $fast) {
//没有环,fast走到链表尾部,fast为空或者fast的next为空
if ($fast == null || $fast->next == null) {
return false;
}
$slow = $slow->next;
$fast = $fast->next->next;
}
return true;
}

快慢指针法是看了题解后做出来的,一开始有点不明白:为什么快指针速度为 2,慢指针速度为 1?快指针速度不能为 3 甚至更大吗?

画图画了几遍,大概理解了:

fast 走 2 步,slow走 1 步,如果有环,则 fast 会碰到 slow 或者 fast 会走到 slow 的后面。

如果是 fast 走到 slow 后面,这时候两个指针每走一次它们之间的距离就会缩小 1,最后无论多远两个指针肯定会相遇。

但是如果是 fast 走 3 步,slow 走 1 步,同样是前面的情况,它们之间的距离每次缩小 2,最后 fast 又跑到 slow 前面去了,所以如果 fast 设置为 3,需要多加一个判断条件,见下面代码 while 处。

function hasCycle($head) {
if ($head == null || $head->next == null) {
return false;
}
//快慢指针
$slow = $head;
$fast = $head->next->next;
while ($slow != $fast || $slow->next != $fast) {
//没有环,fast走到链表尾部,fast为空或者fast的next为空
if ($fast == null || $fast->next == null) {
return false;
}
$slow = $slow->next;
$fast = $fast->next->next->next;
}
return true;
}

LeetCode#141-Linked List Cycle-环形链表的更多相关文章

  1. LeetCode 141. Linked List Cycle环形链表 (C++)

    题目: Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked ...

  2. [LeetCode] 141. Linked List Cycle 单链表中的环

    Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked lis ...

  3. LeetCode 141. Linked List Cycle 判断链表是否有环 C++/Java

    Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked lis ...

  4. [leetcode]141. Linked List Cycle判断链表是否有环

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  5. 【LeetCode】Linked List Cycle(环形链表)

    这道题是LeetCode里的第141道题. 题目要求: 给定一个链表,判断链表中是否有环. 进阶: 你能否不使用额外空间解决此题? 简单题,但是还是得学一下这道题的做法,这道题是用双指针一个fast, ...

  6. LeetCode 141. Linked List Cycle (链表循环)

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  7. 141 Linked List Cycle 环形链表

    给定一个链表,判断链表中否有环.补充:你是否可以不用额外空间解决此题?详见:https://leetcode.com/problems/linked-list-cycle/description/ J ...

  8. LeetCode 141. Linked List Cycle(判断链表是否有环)

    题意:判断链表是否有环. 分析:快慢指针. /** * Definition for singly-linked list. * struct ListNode { * int val; * List ...

  9. [LeetCode] 141. Linked List Cycle 链表中的环

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  10. [LeetCode] 142. Linked List Cycle II 链表中的环 II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

随机推荐

  1. video标签加载视频有声音却黑屏

    问题 昨天用户上传了一个视频文件,然而发现虽然有声音但是黑屏. 解释 因为原视频的编码是用 mp4v 格式的,它需要专用的解码器.而 chrome 并不支持,所以无法播放. 然后如果用转码功能转成用 ...

  2. Latex数学符号对应表

    1. 希腊字母 字母 实现 字母 实现 $\alpha$ \alpha $\Alpha$ \Alpha $\beta$ \beta $\Beta$ \Beta $\gamma$ \gamma $\Ga ...

  3. C++ 顺序表练习

    #include <stdio.h> #include <stdlib.h> #include <string.h> struct Array //定义一个数据存储 ...

  4. 【简说Python WEB】视图函数操作数据库

    目录 [简说Python WEB]视图函数操作数据库 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 ...

  5. [前端开发]Vue父子组件的通信及访问

    父传子 props 子传父 自定义事件emit props传数组 props:['cmovies','cmessage'] props传对象 props:{ //1.类型限制 cmovies:Arra ...

  6. Journal of Proteome Research | Utilization of the Proteome Data Deposited in SRMAtlas for Validating the Existence of the Human Missing Proteins in GPM (解读人:梁嘉琪)

    文献名:Utilization of the Proteome Data Deposited in SRMAtlas for Validating the Existence of the Human ...

  7. Unity 游戏框架搭建 2019 (八) 关于导出 UnityPackage 功能的小结

    导出 UnityPackage 功能到这里要告一段落了,相信认真看的童鞋都有收获.笔者在写教程之前纠结了很久.到底是先给出一坨工具代码,然后再逐个讲解比较好,还是一篇一个知识点比较好.后来想通了.工具 ...

  8. python https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]

    python爬虫,使用requests库发送https请求报错:SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 解决方法: imp ...

  9. 五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类 ...

  10. Mysql性能优化:什么是索引下推?

    导读 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询. 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行 ...