力扣141 環形鍊錶

2022-03-29 09:59:13 字數 1800 閱讀 6162

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

為了表示給定鍊錶中的環,我們使用整數 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

解釋:鍊錶中沒有環。

1

public

class

solution

10 slow =slow.next;

11 fast =fast.next.next;

12if(slow ==fast)

13break;14

}15return

true;16

}17 }

力扣測試時間為0ms, 空間為39.7mb

時間複雜度:我們根據慢指標所走過的路程來作為時間複雜度的估計,假設從煉表頭結點到入環結點的結點個數為n1, 環的結點的個數為l,前n1的結點的時間是o(n1),下面討論慢指標在後l個結點上所花費的時間。

根據環形跑道相向的追及問題,如果兩個跑步者從同一起點出發,第一次相遇肯定是速度快著比速度慢者多跑了一圈,當兩人相遇時距離他們下次相遇所花費的時間是最大的(假設花費的時間為t),其他情況下距離他們的下次相遇時間都小於這個最大值,所以從現在開始到相遇,速度快者比速度慢者多跑的距離肯定小於一圈。

慢指標入環後,此時快指標已經在環上了,所以距離他們的下次相遇時間肯定小於等於t,所以從現在開始到相遇,快指標比慢指標多跑的距離肯定小於一圈,假設慢指標的速度為v,指標的速度為kv, 那麼kvt - vt <= l,  所以 vt<= l/(k-1), 又因為 k = 2, 所以 vt <= l, vt剛好是慢指標在環上經過的結點個數,所以慢指標入環後最多經過 l 個結點就會被快指標追上,所以慢指標從入環到相遇所花費的時間最大為o(l),所以總的時間為o(t) <= o(n1)+o(l) = o(n)

所以時間複雜度為o(n)

空間複雜度:o(1)

遍歷鍊錶,遍歷過程中嘗試把結點放入集合中,對於每個結點,如果集合中已經存在該結點,說明存在環,返回true

1

public

class

solution else10}

11return

false;12

}13 }

力扣測試時間為375ms, 空間為39.8mb(這個時間花費著實有點恐怖)

時間複雜度:遍歷了一次鍊錶,所以時間複雜度為o(n),雖然複雜度是o(n), 但是力扣測試時間卻這麼大,應該是contains()函式的花費比較大,因為contains()不是紅黑樹儲存,所以查詢效率不是很高。

空間複雜度:空間花費主要是集合中元素的個數,最大為o(n)

力扣 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 不作為引數進行傳遞,僅僅是為了標識...