美文网首页
[剑指offer][Java]链表中环的入口节点

[剑指offer][Java]链表中环的入口节点

作者: Maxinxx | 来源:发表于2019-07-05 21:51 被阅读0次

    题目

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

    程序核心思想

    • 第一种方法的思想非常简单。使用一个hashset,遍历每一个节点,如果其出现在hashset中,那么返回它,它就是环的入口节点。如果没出现,则添加到hashset中,直到遍历完所有的(null),则返回null。
    • 第二种方法是一个结论,记住就好了。
      准备两个指针,一个快指针一个慢指针,快指针一次走两步,慢指针一次走一步,如果快指针走到null了,直接返回false,否则快慢指针一定会在环上相遇。当快慢指针相遇时,快指针回到链表的头部,然后快指针从走两步变为走一步,则快慢指针一定会在环的入口节点处相遇。

    Tips

    hashset的方法.png

    代码

    /*
     public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }
    */
    import java.util.HashSet;
    public class Solution {
    
        public ListNode EntryNodeOfLoop(ListNode pHead)
        {
            HashSet<ListNode> hs = new HashSet<ListNode>();
            
            while(pHead != null){
                if(hs.contains(pHead)){
                    return pHead;
                }else{
                    hs.add(pHead);
                }
                pHead = pHead.next;
            }
            return null;
        }
    }
    
    //LeetCode
    /**
     * Definition for singly-linked list.
     * class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) {
     *         val = x;
     *         next = null;
     *     }
     * }
     */
    public class Solution {
        public ListNode detectCycle(ListNode head) {
            if(head == null) return null;
            ListNode fast = head;
            ListNode slow = head;
            if(head.next != null && head.next.next != null){
                slow = head.next;
                fast = slow.next;
            }else{
                return null;
            }
            while(fast.next != null && fast.next.next != null){
                if(fast == slow){
                    fast = head;
                    while(fast != slow){
                        slow = slow.next;
                        fast = fast.next;
                    }
                    return fast;
                }else{
                    slow = slow.next;
                    fast = fast.next.next;
                }
            }
            return null;
        }
    }
    

    相关文章

      网友评论

          本文标题:[剑指offer][Java]链表中环的入口节点

          本文链接:https://www.haomeiwen.com/subject/fnyyhctx.html