给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
//快慢指针判断链表是否存在环,并得到快慢指针相遇节点meetNode
ListNode meetNode = meetNode(pHead);
if (meetNode == null) {
return null;
}
//相遇节点meetNode绕环循环一圈得到环中节点数量number
ListNode p1 = meetNode;
int number = 1;
while (p1.next != meetNode) {
p1 = p1.next;
number++;
}
//指针p1先走n步,指针p1p2相遇节点为环的入口
p1 = pHead;
for (int i = 0; i < number; i++) {
p1 = p1.next;
}
ListNode p2 = pHead;
while (p1 != p2) {
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
private ListNode meetNode(ListNode pHead) {
if (pHead == null) {
return null;
}
ListNode slow = pHead.next;
if (slow == null) {
return null;
}
ListNode fast = slow.next;
while (slow != null && fast != null) {
if (slow == fast) {
return slow;
}
slow = slow.next;
fast = fast.next;
if (fast != slow) {
fast = fast.next;
}
}
return null;
}
}