2.给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

 

 

 

 

 

 

//思路:1.判断链表中有环 -> 2.得到环中节点的数目 -> 3.找到环中的入口节点
public class Solution {
 
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        if(pHead == null){
            return null;
        }
        // 1.判断链表中有环
        ListNode l=pHead,r=pHead;
        boolean flag = false;
        while(r != null && r.next!=null){
            l=l.next;
            r=r.next.next;
            if(l==r){
                flag=true;
                break;
            }
        }
        if(!flag){
            return null;
        }else{
            // 2.得到环中节点的数目
            int n=1;
            r=r.next;
            while(l!=r){
                r=r.next;
                n++;
            }
            // 3.找到环中的入口节点
            l=r=pHead;
            for(int i=0;i<n;i++){
                r=r.next;
            }
            while(l!=r){
                l=l.next;
                r=r.next;
            }
            return l;
        }
 
    }
}

 

/*fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇
此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内的相遇点),
这次两个指针继续走,一次走一步,相遇的地方就是入口节点*/
/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode fast=pHead,slow=pHead;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(slow==fast){
                break;
            }
        }
        if(fast==null||fast.next==null)
            return null;
        fast=pHead;
        while(fast!=slow){
            slow=slow.next;
            fast=fast.next;
        }
        return fast;
    }
}

 

posted @ 2020-04-01 16:43  冰河入梦~  阅读(478)  评论(0编辑  收藏  举报