剑指offer 055 链表中环的入口结点

题目描述

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


/*
 public class ListNode {
    int val;
    ListNode next = null;

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

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        if(pHead==null||pHead.next==null||pHead.next.next==null)
            return null;
        
        ListNode fast=pHead.next.next;
        ListNode slow=pHead.next;
        
        /先判断有没有环
        
        while(fast!=slow){
            if(fast.next!=null&&fast.next.next!=null){
                fast=fast.next.next;
                slow=slow.next;
            }else{
                没有环,返回
                return null;
            }
        }
        
        循环出来就是有环,且此时fast==slow
        
        fast=pHead;
        while(fast!=slow){
            fast=fast.next;
            slow=slow.next;
        }
        return slow;
    }
}


//这是一种新奇的方法,用HashSet的方法


/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
import java.util.HashSet;
import java.util.Set;
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        Set<ListNode> set=new HashSet<ListNode>();
        
        while(pHead!=null){
            if(set.contains(pHead)){
               return pHead; 
            }else{
                set.add(pHead);
            }
            pHead=pHead.next;
        }
        return null;
    }
}
上一篇:剑指offer 15


下一篇:剑指offer 056 删除链表中重复的结点