力扣141 環形鍊錶(雙指標)

2021-10-05 07:37:33 字數 1281 閱讀 5722

力扣141. 環形鍊錶(雙指標)

給定乙個鍊錶,判斷鍊錶中是否有環。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出:true

解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0

輸出:true

解釋:鍊錶中有乙個環,其尾部連線到第乙個節點。

示例 3:

輸入:head = [1], pos = -1

輸出:false

解釋:鍊錶中沒有環。

高階:你能用 o(1)(即,常量)記憶體解決此問題嗎?

通過使用具有不同速度的快、慢兩個指標遍歷鍊錶,空間複雜度可以被降低至o(1)。慢指標每次移動一步,而快指標每次移動兩步。

雜度分析

#include "stdafx.h"

#include#include#include using namespace std;

struct listnode

};class solution

} //如果快慢指標找到空結點,即不存在環

return false;

}};int main()

; head[0].next = &head[1]; head[1].next = &head[2]; head[2].next = &head[3];

head[3].next = &head[4]; head[4].next = &head[5]; head[5].next = &head[6];

solution s;

auto result = s.hascycle(head);

return 0;

}

思路

我們可以通過檢查乙個結點此前是否被訪問過來判斷鍊錶是否為環形鍊錶。常用的方法是使用雜湊表。

演算法

我們遍歷所有結點並在雜湊表中儲存每個結點的引用(或記憶體位址)。如果當前結點為空結點 null(即已檢測到鍊錶尾部的下乙個結點),那麼我們已經遍歷完整個鍊錶,並且該鍊錶不是環形鍊錶。如果當前結點的引用已經存在於雜湊表中,那麼返回 true(即該鍊錶為環形鍊錶)。

複雜度分析

力扣 141 環形鍊錶

題目 給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 ...

力扣 141 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。該題目來自力扣題庫 示例示例1 輸出 true 鍊錶中有乙個環,其尾部連線到第二個節點 示例2 輸入 head 1,2 pos ...

力扣141 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意 pos 不作為引數進行傳遞,僅僅是為了標識...