給定乙個單鏈表 l:l0→l1→…→ln-1→ln ,
將其重新排列後變為: l0→ln→l1→ln-1→l2→ln-2→…
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
這個問題的物件如果是支援下標索引的陣列那就簡單很多了,根據陣列下標進行重組就可以,但是鍊錶本身是不支援下標索引的,所以很自然地會想到先將鍊錶中的每個節點存入陣列資料結構中,這樣就容易多了,這種解法的時間複雜和空間複雜度都是o(n),還有一種方案要稍複雜一點,那就是先找到鍊錶的中間節點,然後翻轉後半段鍊錶,最後合併鍊錶,這樣可以做到常數的空間複雜度,下面是使用這個思路完成的c++**:
/**
* definition for singly-linked list.
* struct listnode
* listnode(int x) : val(x), next(nullptr) {}
* listnode(int x, listnode *next) : val(x), next(next) {}
* };
*/class
solution
fast=slow-
>next;
slow-
>next=
null
;while
(fast)
fast=slow-
>next;
slow-
>next=
null
;while
(fast)}}
;
執行效果(感覺時間和空間複雜度都不優秀。。。。):
下面我們用python來實現一下第乙個思路:
# definition for singly-linked list.
# class listnode:
# def __init__(self, val=0, next=none):
# self.val = val
# self.next = next
class
solution
:def
reorderlist
(self, head: listnode)
->
none
:"""
do not return anything, modify head in-place instead.
"""ifnot head:
return
nodelist=
list()
temhead=head
while
(temhead)
: temhead=temhead.
next
left=
0 right=
len(nodelist)-1
while
(left
: tmpnext=nodelist[left]
.next
nodelist[left]
.next
=nodelist[right]
nodelist[right]
.next
=tmpnext
left+=
1 right-=
1 nodelist[left]
.next
=none
執行效果(時間複雜度方面好像還挺優秀的。。。。。):
(應該是我**沒優化的原因,還要多加練習啊!)
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
leetcode每日一題143 重排鍊錶
給定乙個單鏈表 l l0 l1 ln 1 ln 將其重新排列後變為 l0 ln l1 ln 1 l2 ln 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 5,重新排列為 1 5 2...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...