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 ...