1. 程式人生 > 其它 >2021-02-06

2021-02-06

技術標籤:LeetCode連結串列演算法java

一、需求

  • 給定一個連結串列,判斷連結串列中是否有環。

輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:連結串列中有一個環,其尾部連線到第二個節點。

提示:

  • 連結串列中節點的數目範圍是[0, 104]
  • -105<= Node.val <= 105
  • pos-1或者連結串列中的一個有效索引

二、快慢指標

2.1 思路分析

  1. 判斷一個連結串列是否有環可以利用快慢指標解決,思路與上一篇快樂數:https://blog.csdn.net/Sruggle/article/details/113744141一致;

2.2 程式碼實現

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null) return false;
        ListNode fast = head.next;
        ListNode slow = head;
        while(fast != null && fast.next != null && fast != slow) {
            fast = fast.next.next;
            slow = slow.next;
        }
        return fast != null && fast.next != null;
    }
}

2.3 複雜度分析

  • 時間複雜度為O(N);
  • 空間複雜度為O(1);

三、雜湊表

3.1 思路分析

  1. 思路同上一篇快樂數:https://blog.csdn.net/Sruggle/article/details/113744141一致;
  2. 即將連結串列中的節點存進雜湊表中,若出現相同元素,就說明有環;

3.2 程式碼實現

public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> hs = new HashSet<>();
        ListNode p = head;
        while(p != null) {
            if(hs.contains(p)) {
                return true;
            }
            hs.add(p);
            p = p.next;
        }
        return false;
    }
}

3.3 複雜度分析

  • 時間複雜度為O(N);
  • 空間複雜度為O(N);