力扣 148 排序鍊錶

2022-04-09 13:46:44 字數 925 閱讀 8838

傳送門

題目分析:題目要求時間複雜度為$o(nlogn)$,空間複雜度為$o(1)$,根據時間複雜度,我們自然能想到二分,故這裡要用到歸併排序。對鍊錶的排序,可以通過修改指標來更改節點順序,無需像陣列一樣額外開闢儲存空間。歸併排序有遞迴和非遞迴的做法,這裡採用遞迴的做法。

首先,講一下什麼是歸併排序?

歸併排序採用了分治法的思想,對於乙個很大的數列的排序,將其對等分為左右兩個子數列進行排序,按照遞迴的思想繼續對等劃分,直至數列中只有乙個元素(乙個元素就不用排序了)。然後再一層一層地合併(注意這裡合併是按照小的再前進行的)。

具體的做法如下:

/*

* * definition for singly-linked list.

* struct listnode

* }; */

class

solution

listnode* temp = slow->next;

slow->next =null;

//將左煉表和右鍊錶分別排序

listnode* left =sortlist(head);

listnode* right =sortlist(temp);

listnode* h = new listnode(0

); listnode* result =h;

//合併

while(left != null && right !=null)

else

h = h->next;

}h->next = left == null?right:left;

return result->next;}};

力扣 148 排序鍊錶

給你鍊錶的頭結點 head 請將其按 公升序 排列並返回 排序後的鍊錶 高階 你可以在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序嗎?示例 1 輸入 head 4,2,1,3 輸出 1,2,3,4 示例 2 輸入 head 1,5,3,4,0 輸出 1,0,3,4,5 示例 ...

力扣c語言實現 148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5 typedef struct listnode node struct listnode sortlist st...

148 排序鍊錶

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