链表中环的入口结点 --剑指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;
    }
}

 

posted @ 2020-03-11 20:36  nlw  阅读(120)  评论(0编辑  收藏  举报