LeetCode-Python-86. 分隔連結串列(連結串列)
給你一個連結串列和一個特定值 x ,請你對連結串列進行分隔,使得所有小於 x 的節點都出現在大於或等於 x 的節點之前。
你應當保留兩個分割槽中每個節點的初始相對位置。
示例:
輸入:head = 1->4->3->2->5->2, x = 3
輸出:1->2->2->4->3->5
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/partition-list
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
第一種思路:
暴力解,線性掃描輸入連結串列,然後維護兩個新的連結串列,第一個連結串列按順序儲存所有小於x 的節點,第二個連結串列按順序儲存所有大於或等於x的節點。
維護完成後,把第二個連結串列的頭接到第一個連結串列的尾部即可。
時間複雜度:O(N)
空間複雜度:O(N)
class Solution(object):
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
smaller_dummy_head = ListNode(-2)
larger_dummy_head = ListNode(-1)
p = head
ps, pl = smaller_dummy_head, larger_dummy_head
while p:
if p.val < x:
ps.next = ListNode(p.val)
ps = ps.next
else:
pl.next = ListNode(p.val)
pl = pl.next
p = p.next
ps.next = larger_dummy_head.next
return smaller_dummy_head.next
第二種思路:
原地演算法,
首先找到第一個大於等於x的Node,以它和它的preNode之間的間隔作為分割點,將連結串列一分為二,前一半叫做first_tail, 後一半叫做second_head。
為啥要這麼分呢,因為前一半連結串列已經排好序了,我們接下來要做的就是把後一半連結串列裡的所有比 x 小的Node 拿出來,再按順序插入到前一半連結串列的尾部。
時間複雜度:O(N)
空間複雜度:O(1)
class Solution(object):
def partition(self, head, x):
"""
:type head: ListNode
:type x: int
:rtype: ListNode
"""
if not head:
return head
dummy_head = ListNode(-1, head)
p = dummy_head
second_head = None
while p and p.next:
if p.next.val >= x:
first_tail = p
second_head = p.next
break
p = p.next
if not second_head:
return head
pre = second_head
p = second_head.next
while p:
nxt = p.next
if p.val < x:
# pull out Node p, and append it to the first tail
pre.next = p.next
first_tail.next = p
first_tail = first_tail.next
p.next = second_head
else:
pre = p
p = nxt
return dummy_head.next
def printLL(self, l):
res = []
p = l
while p:
res.append(p.val)
p = p.next
print(res)
相關文章
- 86. 分隔連結串列(Java)Java
- LeetCode 86 ——分隔連結串列LeetCode
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- LeetCode 86. 分隔連結串列LeetCode
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現
- 連結串列入門與插入連結串列
- (連結串列)連結串列的排序問題排序
- 連結串列
- javascript中的連結串列結構—雙向連結串列JavaScript
- 力扣 leetcode 86. 分隔連結串列力扣LeetCode
- Leetcode_86_分割連結串列_連結串列LeetCode
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- php連結串列PHP
- 連結串列操作
- 連結串列逆序
- 2、連結串列
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- 連結串列以及golang介入式連結串列的實現Golang
- Linux核心連結串列-通用連結串列的實現Linux
- 資料結構-單連結串列、雙連結串列資料結構
- 反轉連結串列、合併連結串列、樹的子結構
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- 連結串列專題——面試中常見的連結串列問題面試
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 連結串列(python)Python
- 雙向連結串列
- 反轉連結串列
- 構建連結串列
- 旋轉連結串列
- 環形連結串列_相交連結串列_多數元素(java語言)Java