刻意练习:LeetCode实战 -- Task09. 环形链表
背景
本篇图文是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. 环形链表相关推荐
- LeetCode实战:环形链表 II
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a lin ...
- LeetCode实战:环形链表
题目英文 Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linke ...
- LeetCode实战:排序链表
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Sort a link ...
- LeetCode实战:删除链表中的节点
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a fun ...
- LeetCode实战:反转链表
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Reverse a s ...
- LeetCode实战:相交链表
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a pro ...
- leetcode算法题--环形链表 II★
原题链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/ 1.map ListNode *detectCycle(ListNode *he ...
- 【LeetCode - 141142】环形链表(i和ii)(快慢指针,链表)
https://leetcode-cn.com/problems/linked-list-cycle/ 给定一个链表,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到 ...
- 20190829:(leetcode习题)环形链表
环形链表 题目 大致思路 代码实现 题目 大致思路 快慢指针法:fast指针比slow指针快一步,存在环时fast可以追上slow,最后指向相同,即可判断存在环. 递归法:每次都把指针指向自己,如果有 ...
最新文章
- LIVE 预告 | 快手宋洋:千亿特征,万亿参数,快手推荐精排模型的发展史
- 在编程和算法领域,有哪些经典问题
- html无间隔字幕滚动,js实现文字超过显示宽度每间隔1s自动向左滚动显示
- Android TextView内容过长加省略号,点击显示全部内容
- DotNet(C#)自定义运行时窗体设计器 一
- 小程序复制内容至剪贴板
- 【AcWing】103. 电影(离散化)
- Python变量和字符串详解
- HDU 6321(状压dp)
- Html post易语言服务器,POST其实很简单 15 易语言模块之精易模块
- java工具类 文件zip压缩 base64 加密,base64解密 zip解压
- 二分法和黄金分割法的区别和联系,附Python代码
- abap开发那点事 (二)
- 2019 数学建模国赛 C 题思路
- 浏览器查找文献\论文\资料\文档的小技巧
- hypervisor - qnx
- GRU预测股票价格,附带例子和完整代码
- IIS Nginx Apache Tomcat 中间件漏洞
- Accessibility Verification Test--无障碍测试简介
- 游戏原画设计HTML5模板是一款适合网页游戏原画设计作品展示的HTML5网站模板。