[剑指offer-23]链表中环的入口节点
程序员文章站
2022-06-17 17:22:07
...
[23]链表中环的入口节点
文章目录
1.题目
如果一个链表中包含环,如何找出环的入口节点?
2.思路
快慢指针扫描
- 用两个指针
first
、second
分别从起点开始走。 -
first
每次走一步,second
每次走两步 - 如果过程中
second
走到null
,说明没有环 - 否则当
first
和second
相遇后,让first
返回起点,second
待在原地不动,然后两个指针每次分别走一步,当相遇时,相遇点就是环的入口。
证明
是起点, 是环的入口, 是两个指针的第一次相遇节点
-
之间的距离为
-
之间的距离为
-
之间顺时针距离为
在第一次相遇时
first
走的距离
second
走的距离 ,表示圈数
second
走的距离是first
的两倍
那么:让
second
从 点走 步,恰好到让
first
从 点走 步,也能到
3.代码
class Solution {
public:
ListNode *entryNodeOfLoop(ListNode *head) {
if(!head || !head->next) return 0;
ListNode *first=head;
ListNode *second=head;
while(first && second)
{
first = first->next;
second = second->next->next;
if(first==second) //相遇后,first返回head,first和second都只走一步
{
first=head;
while(first != second)
{
first = first->next;
second = second->next;
}
return first;
}
}
return 0;
}
};
推荐阅读
-
PHP实现找出链表中环的入口节点
-
leetcode 160剑指offer面试题52. 两个链表的第一个公共节点(python3)
-
《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点
-
剑指 Offer 18. 删除链表的节点
-
(三)剑指offer35 两个链表的第一个公共节点
-
牛客 剑指Offer 单链表判断是否有环 以及找出环的入口点
-
PHP实现找出链表中环的入口节点
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
剑指offer55:链表中环的入口结点
-
剑指offer 之 链表中环的入口节点