题解 | #链表中环的入口结点 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来存储已经遍历过的结点,当第一次出现重复的结点时,即为入口结点。
查看17道真题和解析