【算法/剑指Offer】给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

牛客 剑指Offer 单链表判断是否有环 以及找出环的入口点 牛客 剑指Offer 单链表判断是否有环 以及找出环的入口点。 阅读详情

 如果一个链表中有环,那么,我们如何找到这个链表的入口节点呢? 

  思路是这样的:设定两个指针,一个慢指针,一个快指针,快指针的速度是慢指针的两倍,然后呢,如果有环,他们一定会在环中相遇。 

 (1) 如果这时快指针已经是在环里走了一圈了(这种情况对应于非环指针较短的情况),如下所示:

根据上图,我们可以得到下面的关系式:

  • w + n + y = 2 (w + y)

   经过化简,我们可以得到:w  = n - y;

      所以,这种情况下,我们就可以直接把p2放在pHead处,然后让两个指针以同样的速度走,那么,两者下一次就一定在入口节点相遇了。

  (2)如果是相遇的时候,p2已经走了很多圈了,思路也是一样的,只是这时的w会更长一点,并且我们可以肯定的是p1肯定不会绕着圈走一圈,即p1只在环上走了y的距离:

  • w + y + kn = 2 (w + y) 

  同样,我们可以推到出来, kn - y = w。 

  然后,这时还是可以将P2放在pHead处,p1在转了n圈之后,也一定会在入口节点和刚刚到来的p2相遇。 

   所以, 最终代码如下所示:

/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function EntryNodeOfLoop(pHead)
{
    // write code here
    // 使用两个指针,一个快的,一个慢的,快的时慢的两倍,如果有环,那么他么一定会相遇。
    if (pHead == null || pHead.next == null) {
        return null;
    }
    
    var p1 = pHead;
    var p2 = pHead;
    while (p2 != null && p2.next != null) {
        p1 = p1.next;
        p2 = p2.next.next;
        if (p1 == p2) {
            p2 = pHead;
            while (p1 != p2) {
                p1 = p1.next;
                p2 = p2.next;
            }
            if (p1 == p2) {
                return p1;
            }
        }
    }
    return null;
    
}
module.exports = {
    EntryNodeOfLoop : EntryNodeOfLoop
};

###########################################################

链接:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4
来源:牛客网
这里用到了STL中的set,set有一个特性就是不能插入相同元素,这样只需遍历原List一次就可以判断出有没有环,还有环的入口地址。s.insert(node).second这里在插入的同时也判断了插入是否成功,如果不成功表明set中已经有该元素了,该元素就是环的入口元素。

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        set<ListNode*> s;
        ListNode* node = pHead;
        while(node!=NULL){
            if(s.insert(node).second)
                node = node->next;
            else
                return node;
        }
        return node;
         
    }
};

 

逆向某团mtgsig参数时,我踩过的3个坑:从H5guard混淆到Python校验 本文详细解析了逆向某团mtgsig参数时遇到的三大挑战:H5guard混淆破解、环境补全检测与Python结果校验。通过实战案例,揭示了JavaScript加密算法的逆向技巧,包括控制流混淆拆解、隐蔽环境检测点规避以及跨语言校验的解决方案,为开发者提供了一套完整的逆向工程避坑指南。 阅读详情

相关推荐

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

面试必考真题-算法篇:对于一个给定的链表,返回环的入口节点,如果没有环,返回null。

面试必考真题-算法篇 牛客网 链表 双指针 题目描述 对于一个给定的链表,返回环的入口节点,如果没有环,返回null 拓展: 你能给出不利用额外空间的解法么? 题目分析 1)首先判断是否有环,有环时,返回相遇的节点,无环,返回null 2)有环的情况下,求链表的入环节点 fast再次从头出发,每次走一步,slow从相遇点出发,每次走一步,再次相遇即为环入口点。 下面是Java代码 /** * Definition for singly-linked list. * class ListNode {

gaozhuang63的博客 739

BurpSuit在不同浏览器中配置代理

文章通过分享各大浏览器如何设置代理的知识,帮助初学者快速掌握代理配置相关技能。

北冥同学的成长记录笔记 1万+

leetcode---对于一个给定的链表,返回环的入口节点,如果没有环,返回null

/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode detectCycle(ListNo...

sunnnnh的博客 917

WordPress搭建“外贸独立站”完整操作教程

  以往的文章,我们介绍了很多种搭建独立站的方式,有最省事的Shopify 、最专业的Magento以及最省钱的Wordpress Woocommerce。其中,通过主机托管的方式又分了免费的谷歌云vps主机、1美元Godaddy主机以及SiteGround共享主机三种。建站方法方式实在太多了,有免费的,有廉价的,有商业版的,有共享主机、有云主机主机以及各种各样的vps服务器,选择哪种方式,哪款主机,也只有真正试了才直到。   没错,上述的这些方法方式,无一例外,我都亲身折腾过。从个人实际需求和建站方式来

www25qi的博客 8082

2025东三省D题深圳杯数学建模实战解析:基于多模型融合的法医STR混合样本智能识别系统

本文深入解析了2025年东三省数学建模竞赛D题,即深圳杯赛题,聚焦于法医STR混合样本的智能识别挑战。文章系统阐述了构建一个基于多模型融合的智能识别系统的完整流程,涵盖贡献者人数判定、DNA贡献比例估计、个体基因型推断以及STR谱图去噪四大核心步骤。通过融合高斯混合模型、随机森林、非负矩阵分解、小波变换与深度学习等多种技术,并强调特征工程的重要性,为破解法医DNA混合样本分析这一行业难题提供了清晰的数学建模与AI实战思路。

weixin_29050271的博客 392

链表 | 链表中环的入口结点

如下图所示, 两段链表{1,2}, {3,4,5}, 头结点是1, 环节点是3, {3,4,5}成环.给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null.我们的目标就是在给定的一个链表中找出环节点.

weixin_43268715的博客 1122

RV1126B SDK移植实战:从DDR配置到USB烧写全解析

本文详细解析了RV1126B SDK移植的核心实战流程,重点攻克了DDR初始化失败与USB烧写两大难题。文章从理解启动流程入手,提供了DDR配置错误的排查步骤、SDK编译配置要点,并深入讲解了USB烧写的完整操作与常见问题解决方案,旨在帮助开发者高效完成系统移植与稳定运行。

weixin_29164497的博客 542

牛客刷题——链表中环的入口

题目: 对于一个给定的链表,返回环的入口节点,如果没有环,返回null 链表环的问题在经过了上一次之后,已经掌握了怎么判断是否有环...... 这道题在写的时候也参考了别人的博客,看完之后感觉好强,但是文字描述可能说不清楚,人家的图片和数学分析都很到位,所以这里就偷个懒,站在大佬的肩膀上写博客。 方法一是使用HashSet,将遍历到的节点add到set中,如果add不成功的话,那么当前节点就是环的入口啦。 方法二是基于以前的slow和fast指针来进行判断的,具体的分析可以参考以下文章htt..

a_small_Bird233的博客 157

还原 Windows 环境变量的默认值

有时候,我们可能需要还原环境变量的默认值,以修复可能的配置问题或恢复系统的正常运行。如果您只想还原某个特定的环境变量,可以跳过删除其他变量的步骤,仅删除需要还原的变量即可。在“环境变量”对话框中,继续向下滚动到“系统变量”部分。请注意,在执行以下步骤之前,您应该备份当前的环境变量设置,以便在需要时可以还原。在删除所有需要还原的环境变量后,点击“确定”按钮关闭“环境变量”对话框。在“用户变量”部分,选择需要还原的变量,然后点击“删除”按钮。在“高级”选项卡下方的“环境变量”部分,点击“环境变量”按钮。

PvDeveloper的博客 6342

uniapp(全端兼容) - 实现点击输入框时完美顶起键盘,获取键盘高度动态计算顶起距离,解决软键盘弹出时输入框被覆盖问题,uniapp微信小程序/移动端h5网页/安卓苹果app(示例代码,一键复制

uniapp,支付宝微信小程序,移动端H5网页网站,软键盘弹出位置不对,软键盘挡住了输入框怎么办,获取键盘高度计算弹出距离,uniapp如何解决输入框input激活后键盘弹出遮挡问题,uniapp输入框偶尔被键盘遮挡,解决uniapp在App环境下输入框被软键盘遮挡的问题,uniapp 完美解决苹果和安卓input框遮挡兼容问题,uniapp输入框拉起软键盘时,输入框显示不全,被软键盘挡住一半,input被键盘遮挡的解决方案,软键盘遮挡输入框,uniapp软键盘顶不起来输入框,输入框没有被软键盘弹出来怎么办

✅ 精选推荐文章 1万+

算法的学习笔记—链表中环的入口结点(牛客JZ23)

通过使用快慢指针技术,我们可以高效地检测链表中的环,并找到环的入口结点。这种方法简单明了,同时具备良好的时间和空间复杂度表现。在处理链表相关问题时,快慢指针是一种非常实用的工具,希望本文的讲解能够帮助你更好地理解和解决链表中的环问题。😁热门专栏推荐想学习vue的可以看看这个java基础合集数据库合集redis合集nginx合集linux合集手写机制微服务组件spring_尘觉springMVCmybits🤔欢迎大家加入我的社区尘觉社区。

业精于勤,荒于嬉 1488

ABAP 7.40 FOR 表达式与 REDUCE 构造运算符深度解析:从语法新特性到真实项目实践

ABAP 7.40引入了FOR和REDUCE表达式语法,使代码更简洁和函数式。FOR支持内表迭代和条件迭代,可配合VALUE构造新内表,替代传统LOOP。REDUCE用于归约运算,将多值折叠为单一结果,如求和、拼接等。这些新特性让ABAP更现代化,与SAP新架构协同更好,提升了开发效率和代码可读性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 320

剑指offer--给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null

题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null /** * 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null * //1.判断是否有环用快慢指针,并且设置一个标志位。快指针追上慢指针就是有环 * //2.如果有环。快指针从开始的点开始,慢指针从相遇点开始.各自都走一步 */ public class coding35 { ...

u010160949的博客 881

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

剑指offer_54:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 方法一:辅助HashMap package chap8; import java.util.HashMap; class ListNode { int val; ListNode next = null; ListNode(int val) { this.val ...

王文强的博客 897

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java剑指offer给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 1.我们先看链表里是否有环,没有环的话直接null, 2. 有环的话,再找环的入口结点。 具体: 1.设一个快指针,每次移动两个结点; 设一个慢指针,每次移动一个结点, 让两个指针一起跑,如果有环的话,两个指针必然在环里相遇。 2.两个指针相遇后,再来一个新的指针,指向起点,然后速度和慢指针一样,新指针和慢指针一起跑,当这...

kelexing4的博客 613

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

剑指offer:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

剑指offer算法题 链表 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 题目分析 方法一 HashSet 利用hashset的元素不可重复性,将链表中每个元素添加到hashset中,如果即将添加的元素已经在hashset中,则证明有环。 下面是JAVA算法实现: public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead == null){ return nu

gaozhuang63的博客 316

【剑指offer】给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。java实现

【剑指offer】给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。java实现 方法一:复制HashMap public static ListNode EntryNodeOfLoop(ListNode pHead) { /** * 方法一:辅助HashMap */ HashMap<ListNode,I...

weixin_44026997的博客 507

剑指 Offer 23 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

package SwordOffer; import java.util.Stack; /** * @Description: 题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 * @Param: * @return: * @Author: lvhong * @Date: * @E-mail lvhong282@163.com */ public class lab23easy { class ListNode { int val; List.

qq_34823218的博客 275

剑指offer 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) ...

ljhsxgz的博客 237

剑指offer:面试题56——链表中环的入口节点

剑指offer:面试题56——链表中环的入口节点 题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solu...

MereX的博客 317

剑指offer——判断链表中是否有环

题目链接:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 解题思路: //左神讲的 //先说个定理:两个指针一个fast、一个slow同时从一个链表的头部出发 //fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇 //此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内), //这次两个指针一次走一步,相遇的地...

weixin_30338461的博客 172

剑指offer之判断链表是否包含环

1 问题 判断链表是否包含环 2 思路 2个指针,一个指针走一步,一个指针走2步,如果相遇则有,反之无。 3 代码实现 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define true 1 #define false 0; typedef struct node { in...

码莎拉蒂 2400

《剑指offer55》链表中环的入口结点c++版本

题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 假设链表存在回环,如上图所示。设A为链表的起点,B为回环的起点。现在我们设定两个指针Fast(每次运动2个结点)和Slow(每次运动一个结点)。 首先我们先证明他们一定存在运动到同一点C的必然性。设AB的距离为m,BC的距离为n,环的长度为r。我们知道Fast走的长度为m+n+k1*r, Slow走的长...

自由翱翔的鱼 914

剑指offer之找到链表里面包含环的入口节点

1问题 剑指offer之找到链表里面包含环的入口节点,比如 // node7&lt;-node6 &lt;-node5 // | | //head-&gt;node1-&gt;node2-&gt;node3-&gt;node4 环的入口节点是node2 2代码实...

码莎拉蒂 2415

剑指Offer:链表中环的入口结点Java/Python

1.题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 2.算法描述 灵活用集合 1.初始化一个结点集合容器,用来装结点。\red{1.初始化一个结点集合容器,用来装结点。}1.初始化一个结点集合容器,用来装结点。 2.遍历链表中的结点,并将结点装入集合,当装入某个结点时,集合中已经有该结点,则该结点是链表环的入口。\red{2.遍历链表中的结点,并将结点装入集合...

半路出家的博客 268
上一篇: 【机器学习】参数与超参数
下一篇: 【算法/剑指Offer】在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
HelloZEX
博客等级 码龄11年 486粉丝 264原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值