题目描述

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

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

链表中有环的解释:参考:http://blog.sina.com.cn/s/blog_a1ce3d4b0102wks6.html

上图中的第二个示例图P2改为P1。

环中结点的数目

1)判断一个链表里是否有环时用到了一快一慢两个指针,如果两个指针相遇,表明链表中存在环。两个指针相遇的结点一定在环中,2)从这个结点出发,一边继续向前移动一位一遍计数,当再次回到这个结点时,就可以得到环中的节点数。

解法1:

class Solution {//找到一快一满指针相遇处的节点,相遇的节点一定是在环中public:static ListNode* meetingNode(ListNode* head) {if(head==NULL)return NULL;ListNode* slow = head->next;if(slow==NULL)return NULL;ListNode* fast = slow->next;while (slow != NULL && fast != NULL) {if(slow==fast){return fast;}slow=slow->next;fast=fast->next;if(fast!=slow){fast=fast->next;}}return NULL;}public:ListNode* EntryNodeOfLoop(ListNode* pHead) {ListNode* meetingNode1=meetingNode(pHead);if(meetingNode1==NULL)return NULL;
//      得到环中的节点个数int nodesInLoop=1;ListNode* p1=meetingNode1;while(p1->next!=meetingNode1){p1=p1->next;++nodesInLoop;}
//      移动p1p1=pHead;for(int i=0;i<nodesInLoop;i++){p1=p1->next;}
//      移动p1,p2ListNode* p2=pHead;while(p1!=p2){p1=p1->next;p2=p2->next;}return p1;}
};

解法2: 出错!

class Solution {
public:ListNode* EntryNodeOfLoop(ListNode* pHead){if(pHead==nullptr||pHead->next==nullptr)return nullptr;ListNode* pSlow=pHead;ListNode* pFast=pHead;while(pFast!=nullptr&&pFast->next!=nullptr){pSlow=pSlow->next;//慢结点走1步pFast=pFast->next->next;//快结点走2步if(pFast==pSlow)return pFast;}return nullptr;}
};
// 故上述的这种情况只满足:环中有结点个数为2的情况

测试结果:

您提交的程序没有通过所有的测试用例
case通过率为50.00%

原因是事前不知道环结点有几个,就pFast走到了第二个指针。

解法:3:其它的思路
//先说个定理:两个指针一个fast、一个slow同时从一个链表的头部出发
//fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇
//此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),
//这次两个指针一次走一步,相遇的地方就是入口节点。
//https://blog.csdn.net/snow_7/article/details/52181049
https://blog.csdn.net/WitsMakeMen/article/details/37597291

 class Solution {public:ListNode* EntryNodeOfLoop(ListNode* pHead){if(pHead==nullptr|| pHead->next==nullptr|| pHead->next->next==nullptr)return nullptr;ListNode* fast=pHead->next->next;ListNode* slow=pHead->next;//先判断有没有环while(fast!=slow){if(fast->next!=nullptr&& fast->next->next!=nullptr){fast=fast->next->next;slow=slow->next;}else{//没有环,返回return nullptr;}}//跳出上述循环,则有环,此时fast=slow.fast=pHead;//重新定义fast结点的位置为头结点while(fast!=slow){fast=fast->next;slow=slow->next;}return slow;}
};

通过!

但是没有像之前说的要找出结点的个数!

类似解法:

//左神讲的
//先说个定理:两个指针一个fast、一个slow同时从一个链表的头部出发
//fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇
//此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),
//这次两个指针一次走一步,相遇的地方就是入口节点。
//这个定理可以自己去网上看看证明。https://blog.csdn.net/snow_7/article/details/52181049
//https://www.cnblogs.com/snake-hand/p/3148328.html
class Solution {public: ListNode* EntryNodeOfLoop(ListNode* pHead){ListNode* fast = pHead;ListNode* slow = pHead;while(fast != NULL  && fast->next !=NULL){fast = fast->next->next;slow = slow->next;if(fast == slow)break;}if(fast == NULL || fast->next == NULL)return NULL;fast=pHead;while(fast!=slow){fast=fast->next;slow=slow->next;}return fast;}
};

参考:

【1】https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4

【2】思路2的定理 https://blog.csdn.net/WitsMakeMen/article/details/37597291 待续

8.找出链表环的入口结点相关推荐

  1. 判断链表是否有环,并且找出链表环的接点

    1.判断链表是否有环,根据Floyd判圈法,设置两个指针,fast, slow.fast指针每次移动2个位置,slow指针每次移动1个位置.如果链表有环,fast,slow指针会再次相遇. 2.如果链 ...

  2. 剑指Offer——JZ55.链表环的入口结点【快慢指针】

    题目传送门 题解 **解法一:**记录走过的结点,遇到走过的判定为有环 解法二: AC-Code /* struct ListNode {int val;struct ListNode *next;L ...

  3. [PHP] 算法-请找出带环链表的环的入口结点的PHP实现

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移 ...

  4. php单链表检测有没有环,PHP找出链表中环入口节点步骤详解

    这次给大家带来PHP找出链表中环入口节点步骤详解,PHP找出链表中环入口节点的注意事项有哪些,下面就是实战案例,一起来看一下. 问题 一个链表中包含环,请找出该链表的环的入口结点. 解决思路 第一步, ...

  5. 剑指offer:链表中环的入口结点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题 快慢指针,fast走两步,slow走一步,当他们相遇时,fast走了一圈环,设环为n个节点,此时slow走的 ...

  6. 《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点

    一.两个链表的第一个公共结点: 1.题目: 输入两个链表,找出它们的第一个公共结点. 2.解题思路: (1)第一种:找出两个链表的长度,然后让长的链表先走两个链表的长度差,接着两个链表一起走. (2) ...

  7. 链表中环的入口结点 python_【Github 5K星】BAT头条滴滴小米等笔试面经+深度学习/算法/NLP资源汇总!...

    最近,在GitHub上有位id为imhuay的热心人带头建立了一个关于国内知名互联网企业笔试和面试经验的资源库,光从名称上就能看出其内容有多丰富:<2018/2019/校招/春招/秋招/算法/机 ...

  8. 剑指Offer——链表中环的入口结点

    题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 分析: 设置两个指针p1,p2, 两个指针都从链表的头部开始走,不过p1每次走一步,p2每次走两步. 直到相遇的时候,p2走的长度是p1的两 ...

  9. 剑指offer之链表中环的入口结点

    题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 解题思路 利用一个std::set判重即可,第一次重复的,肯定是环的入口节点. AC代码 /* struct Li ...

  10. 剑指offer(C++)-JZ23:链表中环的入口结点(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null. ...

最新文章

  1. 【云周刊】第146期:史上最大规模人机协同的双11,12位技术大V揭秘背后黑科技...
  2. 到2030年,智能农业或将养活85亿人!但网络安全威胁需要重视
  3. 形态分类法的迭代次数与成键的稳定性
  4. SAP Cloud for Customer里Sales Order和Sales Quote的建模方式
  5. Flash与jsp通信类封装
  6. linux查看进程详细信息top,linux查看系统进程信息命令 px,top详解
  7. idea项目启动不起来_这些教育创业项目你还不知道吗,赶紧收藏起来吧!
  8. java集成spring,Spring集成
  9. 只允许,同一域名下IFRAME,禁止直接访问页面
  10. 搜狗快速排名软件到底哪家更强大?
  11. office visio 替代_5款替代微软Visio的开源免费软件(转)
  12. Office And PDF 病毒分析工具
  13. JavaScript格式化输出时间
  14. Synology NAS加域
  15. 华为云计算IE面试笔记-eBackup有哪几种备份组网方式,各备份组网方式主要的应用场景及备份流程?
  16. edup无线网卡驱动安装linux,EDUP EP-N8513 (RTL8188CUS芯片)在Ubuntu 12.10下的wifi不能连接问题解决方法...
  17. 《团队-团队编程项目作业名称-成员简介及分工》
  18. eclipse创建项目没有web
  19. 斐波那契数列的四种实现方式(C语言)
  20. [ZZ]变速齿轮作者的文章--绝杀反外挂方案

热门文章

  1. python能开发手机app吗_python开发手机app和java相比,缺点是什么?
  2. Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】...
  3. 万字实录:从DDCTF大赛看当前网络安全新趋势 | 硬创公开课总结文+视频(下篇)...
  4. 使用docker下载搭建TeamCity容器并使用
  5. 至今我尚未见过一个程序化交易系统
  6. 使用Python实现一个简单的聊天室
  7. sue的小球 牛客(区间dp)
  8. 如何听清楚、说明白--《结构思考力》
  9. 《凡人修仙传》8.25正式上线链游玩家 | 修仙世界、天降神器
  10. 计算机图画大赛作品六年级,小学学生电脑绘画比赛活动方案-20210407071921.docx-原创力文档...