【Leetcode刷题篇】leetcode141 环形链表II
发布日期:2021-06-29 15:34:08
浏览次数:2
分类:技术文章
本文共 2532 字,大约阅读时间需要 8 分钟。
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
说明:不允许修改给定的链表。
进阶:
你是否可以使用 O(1) 空间解决此题?
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0 输出:返回索引为 0 的链表节点 解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1 输出:返回 null 解释:链表中没有环。
回顾之前的 对其判断是否有环的代码
/** * 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 low = head; ListNode fast = head; while(fast.next!=null && fast.next.next!=null ) { fast = fast.next.next; low = low.next; if(low==fast) { return true; } } return false; }}
题解一、快慢指针来解题
class ListNode{ int val; ListNode next; ListNode(int x){ val = x; next = null; } } public class Solution { public ListNode detectCycle(ListNode head) { if(head==null || head.next==null) { return null; } // 快慢指针 ListNode low = head; ListNode fast = head.next; while(low!=fast) { if(low.next==null || fast.next.next==null) { return null; } low = low.next; fast = fast.next.next; } fast = head; while(low!=fast) { low = low.next; fast = fast.next; } return low; } }
题解二、通过hashset来判断
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode detectCycle(ListNode head) { if(head==null || head.next==null){ return null; } // 用hashset HashSethashSet = new HashSet<>(); hashSet.add(head); while(head!=null){ head = head.next; if(hashSet.contains(head)){ return head; } hashSet.add(head); } return null; }}
引申:两个单链表相交的情况,先要判断其是否有环。
若是两个无环的单链表,存在两个情况,一种是相交,另外一种是不相交;通过hashset来做即可。 一个有环一个无环,必不可能相交。 两个都有环,则是以下三种情况: 有环情况,进行判断 判断环的位置是否相同,如果相同,则用hashset来做即可。 有环情况,如果位置不相同,
cur1 = loop1.next; while(cur1!=loop1) { if(cur1==loop2) { return loop1; } cur1 = cur1.next; } return null;
转载地址:https://codingchaozhang.blog.csdn.net/article/details/110454605 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月30日 18时51分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
最全架构设计实践方法论: 微服务
2019-04-29
Linux下简单几步安装AI开发环境-ROS(超有意思)
2019-04-29
epoll详解
2019-04-29
linux入门--磁盘管理之分区、格式化与挂载
2019-04-29
鸿蒙(二)基于小熊派实现LOT上云的智慧家居项目
2019-04-29
开发必备:HTTP 及 TLS
2019-04-29
Windows 11答疑:大家最关心的10个问题
2019-04-29
select、poll、epoll之间的区别
2019-04-29
Shopify!Shopify!Shopify!
2019-04-29
这是美国MarTech最大的一家独立公司:HubSpot
2019-04-29
从开发到产出:关于机器学习的七则干货建议
2019-04-29
你想成为数据科学家吗?不要把机器学习当成入门第一课
2019-04-29
你想成为数据科学家吗?不要把机器学习当成入门第一课
2019-04-29
现代社会悖论:信息泛滥是一只不守规矩的野兽
2019-04-29
如何设计自己的第一个加密交易机器人?
2019-04-29
浪费在Excel上的时间:如何开始专家式机器学习实验追踪?
2019-04-29
失业三星期:我寻找第二份编程工作之路
2019-04-29
跳过媒介,我们能不能只用思想控制计算机?
2019-04-29
服务器宕机:谷歌最近经历了“黑客攻击”吗?
2019-04-29
RepVGG:极简架构,SOTA性能,让VGG式模型再次伟大
2019-04-29