背景

本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。

本次任务的知识点:链表

链表(Linked List) 是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里除了存放本身数据(data fields)之外还存放其后继节点的指针(Pointer)。

使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

链表有很多种不同的类型:单向链表,双向链表以及循环链表。


题目

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

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


实现

第一种:利用Hash的方式

通过检查一个结点此前是否被访问过来判断链表是否为环形链表。

  • 状态:通过
  • 执行用时:172 ms, 在所有 C# 提交中击败了 8.84% 的用户
  • 内存消耗:26.9 MB, 在所有 C# 提交中击败了 5.17% 的用户
/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int x) {*         val = x;*         next = null;*     }* }*/public class Solution
{public bool HasCycle(ListNode head) {HashSet<ListNode> hashSet = new HashSet<ListNode>();hashSet.Add(head);while (head != null){head = head.next;if (head == null)return false;if (hashSet.Contains(head))return true;hashSet.Add(head);}return false;        }
}

Python 语言

  • 执行结果:通过
  • 执行用时:88 ms, 在所有 Python3 提交中击败了 16.80% 的用户
  • 内存消耗:16.9 MB, 在所有 Python3 提交中击败了 7.04% 的用户
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:hashset = set()hashset.add(head)while head is not None:head = head.nextif head is None:return Falseif head in hashset:return Truehashset.add(head)return False

第二种:利用双指针的方式

  • 状态:通过
  • 执行用时: 112 ms, 在所有 C# 提交中击败了 98.43% 的用户
  • 内存消耗: 24.9 MB, 在所有 C# 提交中击败了 5.13% 的用户
/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public bool HasCycle(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;if (fast == slow)return true;}return false;}
}

Python 语言

  • 执行结果:通过
  • 执行用时:56 ms, 在所有 Python3 提交中击败了 60.97% 的用户
  • 内存消耗:16.6 MB, 在所有 Python3 提交中击败了 11.81% 的用户
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def hasCycle(self, head: ListNode) -> bool:fast = headslow = headwhile fast is not None and fast.next is not None:fast = fast.next.nextslow = slow.nextif fast == slow:return Truereturn False

来源

  • https://leetcode-cn.com/problems/linked-list-cycle/submissions/

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

刻意练习:LeetCode实战 -- Task09. 环形链表相关推荐

  1. LeetCode实战:环形链表 II

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a lin ...

  2. LeetCode实战:环形链表

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

  3. LeetCode实战:排序链表

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Sort a link ...

  4. LeetCode实战:删除链表中的节点

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a fun ...

  5. LeetCode实战:反转链表

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Reverse a s ...

  6. LeetCode实战:相交链表

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a pro ...

  7. leetcode算法题--环形链表 II★

    原题链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/ 1.map ListNode *detectCycle(ListNode *he ...

  8. 【LeetCode - 141142】环形链表(i和ii)(快慢指针,链表)

    https://leetcode-cn.com/problems/linked-list-cycle/ 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到 ...

  9. 20190829:(leetcode习题)环形链表

    环形链表 题目 大致思路 代码实现 题目 大致思路 快慢指针法:fast指针比slow指针快一步,存在环时fast可以追上slow,最后指向相同,即可判断存在环. 递归法:每次都把指针指向自己,如果有 ...

最新文章

  1. LIVE 预告 | 快手宋洋:千亿特征,万亿参数,快手推荐精排模型的发展史
  2. 在编程和算法领域,有哪些经典问题
  3. html无间隔字幕滚动,js实现文字超过显示宽度每间隔1s自动向左滚动显示
  4. Android TextView内容过长加省略号,点击显示全部内容
  5. DotNet(C#)自定义运行时窗体设计器 一
  6. 小程序复制内容至剪贴板
  7. 【AcWing】103. 电影(离散化)
  8. Python变量和字符串详解
  9. HDU 6321(状压dp)
  10. Html post易语言服务器,POST其实很简单 15 易语言模块之精易模块
  11. java工具类 文件zip压缩 base64 加密,base64解密 zip解压
  12. 二分法和黄金分割法的区别和联系,附Python代码
  13. abap开发那点事 (二)
  14. 2019 数学建模国赛 C 题思路
  15. 浏览器查找文献\论文\资料\文档的小技巧
  16. hypervisor - qnx
  17. GRU预测股票价格,附带例子和完整代码
  18. IIS Nginx Apache Tomcat 中间件漏洞
  19. Accessibility Verification Test--无障碍测试简介
  20. 游戏原画设计HTML5模板是一款适合网页游戏原画设计作品展示的HTML5网站模板。

热门文章

  1. 语句覆盖(Statement coverage)
  2. 05-04-查看补丁更新报告
  3. ReentrantLock与synchronized
  4. Python 字典(Dictionary)
  5. 物联网技术正颠覆传统医疗行业
  6. JavaScript作用域原理——预编译
  7. 为创业者保驾护航 “无安全 不创业” 安全狗全国路演北京站
  8. JsonObject json字符串转换成JSonObject对象
  9. 2月国内搜索市场:360继续上升 百度下降0.62%
  10. Android之传感器(一)