本組囊括鍊錶相關題目,難度不等。
題目描述:中等
官方題解:使用成環的思想,原鍊錶連成環,再斷開環和生成新鏈頭和鏈尾即可;
首先將原鍊錶的鏈頭和鏈尾連線起來形成環,然後再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高階,在o(1)空間中解決: 使用雙指標法,這裡用快慢指標賽跑。思路是什麼呢,假設兩個快慢指標在環形賽道上賽跑,快指標每次能跑兩步而滿指標每次能跑一步,這樣下去,設環形長度為k,則快指標經過k次迴圈必定與滿指標相遇;若快指標先跑到了尾部節點,則證明沒有環形跑道。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) (額外的雜湊表)
1class
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小的結點,另乙個鍊錶儲...