2021-02-06
阿新 • • 發佈:2021-02-07
一、需求
- 給定一個連結串列,判斷連結串列中是否有環。
輸入:head = [3,2,0,-4], pos = 1 輸出:true 解釋:連結串列中有一個環,其尾部連線到第二個節點。
提示:
- 連結串列中節點的數目範圍是
[0, 104]
-105<= Node.val <= 105
pos
為-1
或者連結串列中的一個有效索引
二、快慢指標
2.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 思路分析
- 思路同上一篇快樂數:https://blog.csdn.net/Sruggle/article/details/113744141一致;
- 即將連結串列中的節點存進雜湊表中,若出現相同元素,就說明有環;
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);