LeetCode:142. 环形链表 II

这篇具有很好参考价值的文章主要介绍了LeetCode:142. 环形链表 II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


一、🌱142. 环形链表 II

  • 题目描述:给定一个链表的头节点 head,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
    不允许修改 链表。

  • 来源:力扣(LeetCode)

  • 难度:中等

  • 提示:
    链表中节点的数目范围在范围 [0, 104] 内
    -105 <= Node.val <= 105
    pos 的值为 -1 或者链表中的一个有效索引

  • 示例 1
    LeetCode:142. 环形链表 II
    输入:head = [3,2,0,-4], pos = 1
    输出:返回索引为 1 的链表节点
    解释:链表中有一个环,其尾部连接到第二个节点。
    示例 2
    输入:head = [1,2], pos = 0
    输出:返回索引为 0 的链表节点
    解释:链表中有一个环,其尾部连接到第一个节点。
    示例 3
    输入:head = [1], pos = -1
    输出:返回 null
    解释:链表中没有环。

  • 进阶:你是否可以使用 O(1) 空间解决此题?

🌴解题

1.HashSet

HashSet是一种不重复的集合。
方法就是遍历链表,判断:集合是否存在这个节点 || 节点为空
 ① 否:存入集合中。
 ② 是:该节点就是所求。

  • code
public class Solution {
    public ListNode detectCycle(ListNode head) {
        Set<ListNode> NodeSet=new HashSet<>();
        ListNode p=head;
        while(!NodeSet.contains(p) && p!=null){//节点判断是否已经被存入(入环首节点),或者 no 环
            NodeSet.add(p);
            p=p.next;
        }
        return p;        
    }
}

LeetCode:142. 环形链表 II

2.双指针

定义两个指针:快指针 fast、慢指针 slowfast 每次走 2 步,slow 每次走 1 步。

  1. 相遇
    如果链表有环,那么 fastslow 肯定会相遇
  • 为什么
指针 起点 步长 k
fast a 2 (a+2*k)
slow b 1 (b+k)

那么假设环长度是 N;
如果 fastslow 可以相遇则有:(a + 2 * k) = (b + k) + r * N
即:a + k = b + r * N ;对于这样的方程,取任意a b 可以找到多组解释,
所以 有环则必定相遇

  1. 找到入环节点
    对于相遇的节点 fast=slow,我们在取节点 p指向 head,让 pslow 同步遍历,第一次相遇节点为所求节点。
  • why
    LeetCode:142. 环形链表 II

对于fast走到相遇的位置:a + b + n(b + c)
slow走到相遇的位置:a + b + m(b + c),其中(m < n);

而slow每次走的是fast的一半,所以有:2 * [a + b + m(b + c)] = a + b + n(b + c)
a+b = k*(b+c)
移动变形公式:a = r * (b+c) + c ,其中(r=k-1);
结合上图看,从 slowhead 同步遍历,最后在环的入口相遇。

  • code
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast=head,slow=head;
        while(true){
            if(fast==null||fast.next==null){ //不存在环,fast当然率先 null               
                break;
            }

            fast=fast.next.next;// 2
            slow=slow.next;

            if(fast==slow){// fast、slow 相遇
                fast=head;
                while(fast!=slow){
                    fast=fast.next;
                    slow=slow.next;
                }
                return fast;
            }
        }
        return null;
    }
}

LeetCode:142. 环形链表 II
空间复杂度 - O(1)


🌱 人生得意须尽欢,莫使金樽空对月。

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

LeetCode:142. 环形链表 II

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓 文章来源地址https://www.toymoban.com/news/detail-465710.html

到了这里,关于LeetCode:142. 环形链表 II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode刷题:142. 环形链表 II

    题目: 是否独立解决: 否,参考了解题思路解决问题,思考了用快慢指针,栈,统计链表数量定位尾巴节点(因为是环形链表所以是死循环,链表数量用while循环统计不出来)都没解决 解题思路:这题其实和环形链表一样的解题思路,用哈希set将数据都存储进去,如果发现

    2024年01月21日
    浏览(40)
  • ​LeetCode解法汇总142. 环形链表 II

    https://github.com/September26/java-algorithms 给定一个链表的头节点   head  ,返回链表开始入环的第一个节点。  如果链表无环,则返回  null 。 如果链表中有某个节点,可以通过连续跟踪  next  指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 

    2024年02月14日
    浏览(39)
  • LeetCode[141] [142] 环形链表I II

    141. 环形链表 - 力扣(LeetCode) 142. 环形链表 II - 力扣(LeetCode) 题解: 快慢指针题 从head开始,一个快指针,一次前进两步,一个慢指针,一次走一步 如果没有环,则快指针首先到达链表尾部, 如果有环,快慢指针肯定能相遇即fast=slow 141代码: 对于142需要环的起点,需要

    2024年02月04日
    浏览(43)
  • [LeetCode]-160. 相交链表-141. 环形链表-142.环形链表II-138.随机链表的复制

    目录 160.相交链表  题目 思路 代码  141.环形链表  题目 思路 代码 142.环形链表II 题目 思路 代码 160. 相交链表 - 力扣(LeetCode) https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 给你两个单链表的头节点  headA  和  headB  ,请你找出并返回两个单链表相交的起始节点

    2024年02月05日
    浏览(48)
  • leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题

    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。 思路: 快慢指针问题 。我们可以声明一个 fast 指针(一次走两步),声明一个 slow

    2024年02月12日
    浏览(62)
  • 代码随想录 Leetcode142. 环形链表 II

            双指针解决百分之99的链表题

    2024年01月19日
    浏览(43)
  • 【刷题专栏—突破思维】LeetCode 142. 环形链表 II

    前言 :本篇博客将讲解三个OJ题,前两个作为铺垫,最后完成环形链表的节点的寻找 题目链接:LeetCode—相交链表 题目描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节

    2024年02月05日
    浏览(38)
  • LeetCode - 142. 环形链表 II (C语言,快慢指针,配图)

            如果你对快慢指针,环形链表有疑问,可以参考下面这篇文章,了解什么是环形链表后,再做这道题会非常简单,也更容易理解下面的图片公式等。 LeetCode - 141. 环形链表 (C语言,快慢指针,配图)-CSDN博客         上述文章总结: 如果一个链表是环形链表,采用

    2024年02月05日
    浏览(55)
  • 每日两题 / 142. 环形链表 II & 146. LRU 缓存(LeetCode热题100)

    142. 环形链表 II - 力扣(LeetCode) 用哈希记录走过的节点即可 146. LRU 缓存 - 力扣(LeetCode) O ( 1 ) O(1) O ( 1 ) 地查找并修改kv结构,用unordered_map即可解决 问题是题目要求:哈希表容量有限,超出容量时,将删除最久未访问的kv 那么关键就在于:如何用数据结构表示访问的先后顺

    2024年04月16日
    浏览(41)
  • 单链表OJ题:LeetCode--142.环形链表Ⅱ(判断第一次入环的节点)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第142道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!   数据结构与算法专栏 : 数据结构与算法 个  人  主  页  : stackY、 C 语 言 专 栏 : C语言:从入门到精通 Le

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包