题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路分析
基本上都知道链表找环使用快慢指针。
关于获取入环结点,涉及一个规律:如果快指针fast和慢指针slow同时从头结点出发,fast走两步而slow走一步,当两者相遇时,将fast指针指向头结点,使两者都一次只走一步,两者会在入环结点相遇。
代码实现
public ListNode EntryNodeOfLoop(ListNode pHead) {
if (pHead == null || pHead.next == null || pHead.next.next == null) {
return null;
}
//这里也可以直接设置为pHead
ListNode slow = pHead.next;
ListNode fast = pHead.next.next;
while (slow != fast) {
//这种情况认为无环结构
if (fast.next == null || fast.next.next == null) {
return null;
}
slow = slow.next;
fast = fast.next.next;
}
//当快慢指针会合,认为有环
fast = pHead;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}