148 排序鍊錶

2021-10-08 08:16:58 字數 1575 閱讀 7194

題目描述:

在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。

示例 1:

輸入: 4->2->1->3

輸出: 1->2->3->4

示例 2:

輸入: -1->5->3->4->0

輸出: -1->0->3->4->5

方法1:

主要思路:

(1)直觀的想,使用歸併排序,從鍊錶先以長度為1的子鍊錶兩兩合併,形成長度為2的子鍊錶集合,再將鍊錶以長度為2的子鍊錶,兩兩結合,形成長度為4的子鍊錶集合……如此進行下去,直到最大的長度;

(2)為了實現這個過程,先定義了兩個輔助函式,乙個是merge函式,用於合併了兩個有序鍊錶,並將合併後的有序鍊錶的頭部返回,乙個為 listnode* cut(listnode* head,int n) 函式,用於將鍊錶分成兩部分,前面一部分的長度為 n,返回的是後面一部分的頭結點;

(3)以合併長度為 2 的子鍊錶集合為例,先從鍊錶的頭部擷取乙個長度為 2 的子鍊錶,再在返回的後半部分的頭結點上擷取乙個長度為 2 的子鍊錶,合併這兩個有序的子鍊錶,然後再找到這個合併的子鍊錶的結尾結點,將其接到上面第二次擷取子煉表後的返回結點上,重複上述步驟,當長度為 2 的子鍊錶合併結束後,接著就形成了長度為 4 的有序子鍊錶集合,然後重複合併長度為 4的……;

/**

* definition for singly-linked list.

* struct listnode

* };

*/class

solution

if(head==

null

)return

null

; listnode* tmp=head-

>next;

head-

>next=

null

;return tmp;

}//合併兩個有序的子鍊錶

listnode*

merge

(listnode* head1,listnode* head2)

else

} tmp-

>next=head1==

null

?head2:head1;

tmp=dummy-

>next;

delete dummy;

//釋放記憶體

return tmp;

} listnode*

sortlist

(listnode* head)

listnode* cur_tail=

null

;//從長度為 1 的子鍊錶開始合併,直到最後長度

for(

int i=

1;i}}

cur_head=dummy-

>next;

delete dummy;

//釋放記憶體

return cur_head;}}

;

148 排序鍊錶

根據演算法題目要求,看出主要考察排序演算法中的歸併排序,那歸併排序的思想類似於分治。簡單描述為 第一步 遞迴,找中點,切割鍊錶 第二步 對每個子鍊錶操作 第三步 把排序好的子鍊錶一步步合併 class solution 遞迴地切割表 直達最後表只有乙個或者沒有乙個節點 再進行合併 listnode ...

148 排序鍊錶

自己做鍊錶的題很容易弄錯,感覺對鍊錶太不熟悉了。需要加強對鍊錶的練習。這種鍊錶題有時感覺思路很簡單,但是在寫 的過程中會發現處理起來要十分的細心。下面 記錄兩種實現方法 都是別人實現的方法 第一種方法 裡注釋掉的部分 不滿足題目要求 1 設定快慢指標分割鍊錶,遞迴 2 對分割後的鍊錶進行排序,合併兩...

148 排序鍊錶

難度 中等 題目描述 思路總結 題目要求時間複雜度o nlog n 想到二分 想到歸併。歸併遞迴解法,額外空間並不是常數級,所以想到非遞迴自底向上的解法。題解一 遞迴 definition for singly linked list.class listnode def init self,x s...