刷題04 奇偶鍊錶

2021-10-10 12:35:47 字數 1814 閱讀 7556

leetcode 328. 奇偶鍊錶

給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。

請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o(1),時間複雜度應為 o(nodes),nodes 為節點總數。

說明:

思路:顯然,題目要求空間複雜度為o(1),時間複雜度為o(n),即不允許使用兩個佇列或棧進行節點儲存,再重新構建新鍊錶的暴力方法。

那麼,我們就採用兩個指標,分別指向奇數鍊錶和偶數鍊錶,再利用乙個指標指向待分配節點,遍歷完整表再進行組裝即可。

但是,要注意:

/**

* 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

else

//偶數

p=p-

>next;

len++;}

even_p-

>next=

null

;//偶數表的末尾指向null

head-

>next=evenlist;

//奇數表的末尾指向偶數表頭節點

return re;

//返回表頭節點}}

;//空間複雜度:用到四個額外的指標空間和乙個計數空間,依舊是有限的:o(1)

//時間複雜度:從鍊錶的第三個節點開始遍歷整個鍊錶,每次迴圈為o(1),t(n)=(n-2)t(1):o(n)

發現記憶體消耗還是很大,時間也不夠快,檢視一下官方題解。發現新大陸~

官方解答中,思路也是類似的先拆分奇偶鍊錶再合併,但是,不同點在於,我的思路是每次將乙個節點分配到兩個鍊錶中的某乙個內,官方每次將兩個節點分配到兩個鍊錶內!所以其花費的時間是大大減少的。

利用奇偶相連的特性和兩個指標,分別指向奇偶表尾巴,每次將對方指標的next調整為自己的next即可,無需計數器和多餘的判斷。

只是此時要注意,迴圈退出的條件是,偶數指標為空或其next為空,這個畫圖即可理解。

//官方題解

class

solution

listnode* evenhead = head-

>next;

//偶數表頭

listnode* odd = head;

//指向奇數表尾節點

listnode* even = evenhead;

//指向偶數表尾節點

//用head節點作為奇數表頭節點

while

(even !=

nullptr

&& even-

>next !=

nullptr

) odd-

>next = evenhead;

return head;}}

;//空間複雜度:只用到三個額外的指標空間:o(1)

//時間複雜度:從煉表頭開始迴圈,每次迴圈處理兩個節點o(1),t(n)=n/2*t(1):o(n)

每日刷題 奇偶鍊錶

請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o 1 時間複雜度應為 o nodes nodes 為節點總數。示例 1 輸入 1 2 3 4 5 null 輸出 1 3 5 2 4 null 示例 2 輸入 2 1 3 5 6 4 7 null 輸出 2 3 6 7 1 5 4 null 解...

LeetCode刷題筆記 328 奇偶鍊錶

給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o 1 時間複雜度應為 o nodes nodes 為節點總數。示例 輸入 2 1 3 5 6 4 7 nul...

LeetCode 328題 奇偶鍊錶

給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o 1 時間複雜度應為 o nodes nodes 為節點總數。示例 1 輸入 1 2 3 4 5 null ...