题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
import java.util.*; public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { //快慢指针不做介绍,可以去做判读是否有结点的题 ListNode fast = pHead; ListNode slow = pHead; //fast与slow相遇后,newnode与slow同时遍历,相遇的结点便是入口 ListNode newnode = pHead; ListNode rslt = null; //fast与slow一开始是相同的,所有加上这个条件避免while循环误判 int epoch = 0; //当fast与slow相遇则退出 while((fast != slow || epoch == 0) && fast != null && fast.next != null){ epoch++; fast = fast.next.next; slow = slow.next; } //如果因为fast为null退出的处理有null一定无环 if (fast == null){ return rslt; } //如果因为fast.next为null退出的处理有null一定无环 if (fast.next == null){ return rslt; } while(newnode != slow){ newnode = newnode.next; slow = slow.next; } rslt = slow; return rslt; } }
是对快慢指针的举一反三,再对着演算纸看了半天后,发现fast与slow遇上之后,slow结点与头结点离入口节点一样远。