网站建设交易,湖南网页制作,开发区实验小学,官方网站的要素题目导航 【Leetcode Hot 100刷题路线】| 找工作速刷 | 第2题- [92] - 反转链表 II 难度#xff1a;中等 tags#xff1a;链表、双指针 题目描述 给定一个链表的头节点 head #xff0c;返回链表开始入环的第一个节点。 如果链表无环#xff0c;则返回 null。 如果链表中…题目导航【Leetcode Hot 100刷题路线】| 找工作速刷 | 第2题- [92] - 反转链表 II难度中等tags链表、双指针题目描述给定一个链表的头节点head返回链表开始入环的第一个节点。如果链表无环则返回null。如果链表中有某个节点可以通过连续跟踪next指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数pos来表示链表尾连接到链表中的位置索引从 0 开始。如果pos是-1则在该链表中没有环。注意pos不作为参数进行传递仅仅是为了标识链表的实际情况。不允许修改链表。示例 1输入head [3,2,0,-4], pos 1输出返回索引为 1 的链表节点解释链表中有一个环其尾部连接到第二个节点。示例 2输入head [1,2], pos 0输出返回索引为 0 的链表节点解释链表中有一个环其尾部连接到第一个节点。示例 3输入head [1], pos -1输出返回 null解释 链表中没有环。题解主要思路快慢指针 相遇之后路程之间的一些数学关系在上一题 141.环形链表 [141] - 环形链表中我们用快慢指针判断了链表是否有环。如果相遇说明有环。现在要在这道题的基础上更进一步找到环的入口节点。注意没有刷过141.环形链表的请先点击【Leetcode Hot 100刷题路线】| 找工作速刷 | 第21题 - [141] - 环形链表做完再来。利用快慢指针相遇时的位置以及一些简单的数学关系就能确定环的入口。第一步快慢指针找到相遇点与 141 题一样我们让 slow 每次走一步fast 每次走两步。如果链表有环它们一定会在环内某点相遇。我们记这个相遇点为meet。第二步数学推导环入口我们用图演示一下为什么慢指针没把环走完就被追上了想象一下这个场景慢指针 slow 刚进入环的入口时快指针 fast 早已在环内的某个位置,因为它走得快先进入环并在环里绕圈。此时快指针在环内距离慢指针还有一段距离这段距离 一定小于环的周长,因为快指针不可能刚好在慢指针后面一整圈那样它们就重合了。接着两者开始在环内同向移动慢指针每走一步快指针就走两步相当于快指针相对于慢指针以一步的速度靠近。假设它们之间的初始距离是 d0 d 环长 L。快指针需要追上慢指针所需的时间步数正好是 d因为相对速度是1步/次。也就是说从慢指针进入环的那一刻起到它们相遇慢指针恰好走了 d 步。由于 d L所以慢指针还没走完一整圈就被快指针从后面追上了。推导两个快慢指针相遇之后这里借用灵神的插图来辅助讲解由于已知当快慢指针相遇时慢指针还没走完一个环假设快指针移动的距离bkc慢指针移动的距离b因为快指针移动的距离是慢指针的两倍所以 bkc2b —bkc慢指针从入环口走了b-a —kc-a步到达快慢指针的相遇点kc是n圈慢指针已经走了kc-aa就是kc所以还差a步凑满n圈当它凑满n圈了也就走到入环口了所以慢指针从相遇点开始再走a步就恰好走到入环口a虽然未知但此时让head和slow同时走由于路程都是ahead和slow必定会在入环口相遇换句话说如果我们让一个指针从头结点head出发另一个指针从相遇点meet出发每次都走一步它们第一次相遇的位置就是环入口。代码Java版/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val x; * next null; * } * } */publicclassSolution{publicListNodedetectCycle(ListNodehead){ListNodeslowhead;ListNodefasthead;// 1. 判断是否有环并找到相遇点while(fast!nullfast.next!null){slowslow.next;fastfast.next.next;if(slowfast){// 相遇说明有环// 2. 找环入口让一个指针从头出发一个从相遇点出发再次相遇即为入口ListNodeptr1head;ListNodeptr2slow;// 或者 fast因为它们相遇在同一位置while(ptr1!ptr2){ptr1ptr1.next;ptr2ptr2.next;}returnptr1;// 返回入口节点}}// 无环returnnull;}}