LeetCode 鍊錶(三)

2022-07-09 16:39:12 字數 3766 閱讀 6411

本組囊括鍊錶相關題目,難度不等。

題目描述:中等

官方題解:使用成環的思想,原鍊錶連成環,再斷開環和生成新鏈頭和鏈尾即可;

首先將原鍊錶的鏈頭和鏈尾連線起來形成環,然後再n-k的節點後斷開環,下乙個節點n-k+1即是新的鍊錶的鏈頭,n-k是新鍊錶的鏈尾。

上述考慮的是k<=n的情況,如果k>n呢:考慮k = (k//n) * n + k % n,將k寫為兩部分之和,前部分是向下取整,即是n的倍數,不對最終結果有影響,只需考慮後半部分即可。於是,我們把k統一寫為k%n。

1

class

solution:

2def rotateright(self, head: listnode, k: int) ->listnode:34

ifnot

head:

5return

none6if

nothead.next:

7return

head

8 old_tail = head #

old_tail往後移動了,head不會移動仍在原位置

9 n = 1

10while old_tail.next !=none:

11 old_tail = old_tail.next #

先將舊鏈鏈尾的下乙個節點作為新鏈的鏈頭

12 n += 1 #

表長度n

13 old_tail.next = head #

原鏈尾指向原鏈頭,形成環

14 new_head = head #

這句可要可不要

15for i in range( n - k % n - 1):#

從頭走到新的鍊錶尾來斷開環

16 head =head.next

17 new_head = head.next #

找到新鍊錶的頭

18 head.next = none #

再在舊鏈鏈尾斷開環

19return

new_head20#

時間複雜度:o(n),先遍歷一遍找鏈尾,在走n-k-1步。21#

空間複雜度:o(1)

題目描述:中等

對於這個道題來說,比較直觀的想法是將原鍊錶的值分為兩組(大於等於x和小於x)

分組後的兩個小煉表,連線起來即得到答案;

我們用兩個指標來跟蹤這兩個鍊錶,最後連線的時候要注意邊界條件;

1

class

solution:

2def partition(self, head: listnode, x: int) ->listnode:

3 before_head = listnode(0) #

兩個啞節點

4 before = before_head #

兩個指標

5 after_head =listnode(0)

6 after =after_head

7while head: #

遍歷一遍鍊錶

8if head.val

9 before.next =head

10 before =before.next

11else

:12 after.next =head

13 after =after.next

14 head =head.next

15 after.next = none #

這裡需要手動實現斷鏈,不然如果之前這個地方指向的下乙個非空,就會形成環。

16 before.next = after_head.next #

連線兩個鍊錶

17return before_head.next #

返回啞節點的下乙個節點18#

時間複雜度:o(n)19#

空間複雜度:o(1),沒有使用新的空間,原地移動鍊錶

題目描述:簡單

環的意思就是後面會不止一次碰到同乙個節點;

思路就是希望通過乙個類似表來記錄已經走過的節點,若再次碰到這個節點,則返回true

首先想到的就是雜湊表,通過雜湊表來記錄走過的節點;

用python實現的話就是設定乙個字典,鍵為走過的節點值,值設為任意數即可:

1

class

solution:

2def hascycle(self, head: listnode) ->bool:

34 hashmap ={}

5while

head:

6if head in

hashmap:

7return

true

8else

:9 hashmap[head] = 1

10 head =head.next

11return

false12#

時間複雜度o(n),空間複雜度o(n) (額外的雜湊表)

高階,在o(1)空間中解決: 使用雙指標法,這裡用快慢指標賽跑。思路是什麼呢,假設兩個快慢指標在環形賽道上賽跑,快指標每次能跑兩步而滿指標每次能跑一步,這樣下去,設環形長度為k,則快指標經過k次迴圈必定與滿指標相遇;若快指標先跑到了尾部節點,則證明沒有環形跑道。

1

class

solution:

2def hascycle(self, head: listnode) ->bool:

3if head == none or head.next ==none:

4return

false

5 low, fast =listnode(0), listnode(0)

6 low =head

7 fast =head.next

8while fast and fast.next: #

換一種寫法也可以

9if fast ==low:

10return

true

11 low =low.next

12 fast =fast.next.next

13return false

leetcode 鍊錶 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?head null 空鍊錶,回文,返回true head.next null 只有乙個節點的列表,回文,返回tru...

leetcode 鍊錶 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?思路 利用快慢指標找到中間節點,當快指標走到末尾時,慢指標指向中間節點 交中間節點之後的節點進行鍊錶反轉 設定指標p1從h...

分隔鍊錶(鍊錶 LeetCode)

題目鏈結 給你乙個鍊錶和乙個特定值 x 請你對鍊錶進行分隔,使得所有小於 x 的節點都出現在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5維護兩個鍊錶,乙個鍊錶儲存比x小的結點,另乙個鍊錶儲...