链表中环的入口结点 --剑指offer
题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
链接:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4
来源:牛客网
来源:牛客网
两个结论:
1、设置快慢指针,假如有环,他们最后一定相遇。
2、两个指针分别从链表头和相遇点继续出发,每次走一步,最后一定相遇与环入口。
证明结论1:设置快慢指针fast和low,fast每次走两步,low每次走一步。假如有环,两者一定会相遇(因为low一旦进环,可看作fast在后面追赶low的过程,每次两者都接近一步,最后一定能追上)。
代码:
public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead == null) return null; ListNode low=null,fast=null; if(pHead.next != null) { low = pHead.next; }else { return null; } if(low.next != null){ fast=low.next; }else { return null; } while (low != fast){ if(fast.next != null){ fast=fast.next; if(fast.next != null){ fast=fast.next; }else { return null; } }else { return null; } low=low.next; } low=pHead; while (low != fast){ fast=fast.next; low=low.next; } return low; } }