/题目描述
//一个链表中包含环,请找出该链表的环的入口结点。要求不能使用额外的空间。
public class Solution
{
//使用快慢指针来解题。快指针一次走两步,慢指针一次一步。因为是环链表,快慢指针总会相遇。
//设慢指针的速度为x,环之前的节点数为t,环的总节点数为r ,相遇时slow在环中走的步数为y
// x = t + y; 2x = t + r + y;
//2x = 2t + 2y = t + r + y
// t + y = r;
//所以slow再走t步就到达了环的入口节点。这时让res指针从头开始与slow一同走,相遇点就为环的入口节点。
//特别要注意 给定的链表没有环的情况。没有环的话fast.next就会出现null的情况。要排除掉。
public ListNode findStartOfRingList(ListNode head)
{
//链表为空的情况。直接返回Null
if (head == null)
return null;
//定义快慢指针
ListNode fast = head;
ListNode slow = head;
//快慢指针直到相遇之前一直走。 并且要排除没有环的情况
while (fast.next != null && fast != slow)
{
fast = fast.next.next;
slow = slow.next;
}
//没有环的话直接返回null。
if (fast.next == null)
return null;
//定义结果指针指向head
ListNode res = head;
//经过上面的分析,现在res与slow相遇的节点就是环的入口节点。
while (res != slow)
{
res = res.next;
slow = slow.next;
}
return res;
}
}
《剑指offer》NO23 链表中环的入口节点 详解 <Java实现>
最新推荐文章于 2022-09-01 08:36:29 发布