题解 | #链表中环的入口结点 01 02#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
import java.util.HashSet; /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead == null) return null; // 定义快慢指针 ListNode slow = pHead; ListNode fast = pHead; //这个函数判断是否有环 没有环的话是不可能相遇的 while(fast != null && fast.next != null){ // 快指针是满指针的两倍速度 fast = fast.next.next; slow = slow.next; // 记录快慢指针第一次相遇的结点 if(slow == fast) break; } // 若是快指针指向null,则不存在环 if(fast == null || fast.next == null) return null; // 开始找入口 // 重新指向链表头部 fast = pHead; // 与第一次相遇的结点相同速度出发,相遇结点为入口结点 while(fast != slow){ fast = fast.next; slow = slow.next; } return fast; /* // 使用set来记录出现的结点 HashSet<ListNode> set = new HashSet<>(); while(pHead != null){ // 当set中包含结点,说明第一次出现重复的结点,即环的入口结点 if(set.contains(pHead)){ return pHead; } // set中加入未重复的结点 set.add(pHead); pHead = pHead.next; } return null; */ } }
01:
主题思路:
分两步走①判断有没有环,根据快慢节点来处理,没有环的话快慢节点永不相遇;
②有环后,快节点重归起点,此时慢节点还处于公共节点,等快节点进入环肯定能和慢节点相遇
细节处理:①判断环存在的结束条件是快节点或其下个节点为null
②判断有环后,慢节点不动,让快节点追
③快节点只比慢节点快一个身位!
02:
通过使用set或者map来存储已经遍历过的结点,当第一次出现重复的结点时,即为入口结点。