剑指Offer:链表中环的入口结点(java版)

题目描述

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

使用HashSet存储结点

如果已经存在,这个结点就是入环结点

public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead){
        HashSet<ListNode> set = new HashSet<>();
        while(pHead.next!=null){
            if(set.contains(pHead)){
                return pHead;
            }
            set.add(pHead);
            pHead=pHead.next;
        }
        return null;
    }
}

设置快慢指针

设置一个慢指针每次走1步,一个快指针每次走2步,如果有环,一定会在环内相遇。
然后让一个指针回到起点,起点开始走,让一个指针从相遇点开始继续往后走,
2个指针速度一样,那么,当从原点的指针走到环入口点的时候,从相遇点开始走的那个指针也一定刚好到达环入口点。
所以2者会相遇,且恰好相遇在环的入口点。

public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead){
        if(pHead == null || pHead.next==null || pHead.next.next==null) return null;
        ListNode node1 = pHead.next;
        ListNode node2 = pHead.next.next;
        while(node1 != node2) {
            if(node1.next!=null && node2.next.next!=null){
                node1 = node1.next;
                node2 = node2.next.next;
            }else{
                return null;
            }
        }
        node1 = pHead;
        while(node1!=node2){
            node1=node1.next;
            node2=node2.next;
        }
        return node1;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43165002/article/details/90246839