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

题目

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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 hs = new HashSet();
        
        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]链表中环的入口节点)