102.帶環鏈表

描述

給定一個鏈表,判斷它是否有環。

樣例

給出 -21->10->4->5, tail connects to node index 1,返回 true

挑戰

不要使用額外的空間

思路

  1. 使用O(n)的額外空間時,在遍歷整個鏈表的過程中用一個hash表存儲當前結點的引用,如果hash表中已經存在當前結點的引用return false,否則加入hash表,如果遍歷完整個鏈表仍舊沒發現重復值證明鏈表沒環
  2. 定義兩個指針,一個快一個慢,設定快的跑兩步,慢的跑一步,如果有環則它們一定會相遇

兩種思路時間復雜度都是O(n)

變形題目

題目有一種變體,就是判斷兩個鏈表有沒有交集,將第一個鏈表的末指針和第二個鏈表的頭指針連接到一起,若有交集則一定存在環

代碼

/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */
  1. 哈希表法
public class Solution {
    /*
     * @param head: The first node of linked list.
     * @return: True if it has a cycle, or false
     */
    public boolean hasCycle(ListNode head) {
        Set<ListNode> nodesSeen = new HashSet<>();
        while (head != null) {
            if (nodesSeen.contains(head)) {
                return true;
            } else {
                nodesSeen.add(head);
            }
            head = head.next;
        }
        return false;
    }
}
  1. 快慢指針
public class Solution {
    /*
     * @param head: The first node of linked list.
     * @return: True if it has a cycle, or false
     */
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }
        
        // 注意要讓跑的快的在前面,不然沒跑完一圈就追上了
        ListNode slow = head;
        // 如果 fast 也賦值為 head 則在第一個結點就會跳出 while 循環
        ListNode fast = head.next;
        while (slow != fast) {
            // 在沒追上慢指針的情況下,遍歷完了整個鏈表,證明沒有環
            if (fast == null || fast.next == null) {
                return false;
            }
            fast = fast.next.next;
            slow = slow.next;
        }
        // slow == fast時證明有環
        return true;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉載請注明出處:http://www.lxweimin.com/p/c65d9d753c31 在上一篇博客《數據結構...
    Alent閱讀 3,541評論 4 74
  • 大學的時候不好好學習,老師在講臺上講課,自己在以為老師看不到的座位看小說,現在用到了老師講的知識,只能自己看書查資...
    和玨貓閱讀 1,483評論 1 3
  • 本文內容取自于小甲魚的數據結構與算法。http://www.lxweimin.com/p/230e6fde9c75 ...
    阿阿阿阿毛閱讀 2,936評論 0 7
  • 1. 鏈表 鏈表是最基本的數據結構,面試官也常常用鏈表來考察面試者的基本能力,而且鏈表相關的操作相對而言比較簡單,...
    Mr希靈閱讀 1,472評論 0 20
  • 本文涉及更多的是概念,代碼部分請參考之前寫過的 2 篇博客 基于Javascript的排序算法基本數據結構和查找算...
    faremax閱讀 1,308評論 0 2