题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
public ListNode EntryNodeOfLoop(ListNode pHead) { //参数校验 if(pHead == null || pHead.next == null) return null; //校验链表中是否存在环 ListNode slow = hasCycle1(pHead); if(slow != null){ //定义快慢指针 ListNode fast = pHead; while(fast != slow){ fast = fast.next; slow = slow.next; } return slow; }else{ return null; } } public ListNode hasCycle1(ListNode head) { //参数校验 if(head == null || head.next == null) return null; //定义两个快慢节点 ListNode fast = head; ListNode slow = head; //只要快电接点不为空 或者快界定的下一个为空 就结束循环 while(fast != null && fast.next != null){ //快节点每次都两步 fast = fast.next.next; //满节点每次走一步 slow = slow.next; if(fast == slow){ //快慢节点相遇 说明当前链表中有环 return slow; } } //循环结束 方法没有结束 说明快慢节点没有相遇,链表中没有环 return null; }
解题思路:
1、核心是找到其中的数学规律,列出不等式
2、使用快慢指针的方式,自定义快指针步数是满指针步数的二倍列出等式
3、解析等式可以得到,在快指针一次走两步慢指针一次走一步的条件下
4、满指针进入第一次进入到循环就会和快指针相遇,快指针每次都是开始循环第二圈和满指针相遇
5、通过观察等式可得知:快慢指针相遇点到切点入口的距离与从链表头节点到切点的距离相同
6、由此两个满指针一个从相遇点出发,一个从链表头节点触发,最终会在切点相遇。