力扣 148 排序鍊錶

2022-05-19 18:07:39 字數 1698 閱讀 9700

給你鍊錶的頭結點 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]

示例 3:

輸入:head =

輸出:鍊錶中節點的數目在範圍 [0, 5 * 104] 內

-105 <= node.val <= 105

簡單做法:

public

listnode sortlist(listnode head)

list

list = new arraylist();

while(head != null

) collections.sort(list,(item1,item2) -> (item1.val -item2.val));

for(int i = 1; i < list.size(); i++)

list.get(list.size() -1 ).next = null

;

return list.get(0);

}

//首先先用昨天的題目的排序方式寫一遍、發現時間超限

public listnode sortlist(listnode head)

//我們使用 fast,slow 快慢雙指標法,奇數個節點找到中點,偶數個節點找到中心左邊的節點。

listnode fast = head.next;

listnode slow = head;

while(fast != null && fast.next != null)

//將鍊錶分割,分為左邊和右邊

listnode temp = slow.next;

slow.next = null;//分割需要設定為null

listnode left = sortlist(head);

listnode right = sortlist(temp);

//進行左邊和右邊鍊錶的整和

listnode h = new listnode();

listnode result = h;

//這個迴圈沒有問題

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

h = h.next;

}//這裡有一些疑問: h.next = left || h.next = right 為什麼要這麼設定,這兩種設定效果是一樣的

//因為在迴圈結束時,有可能因為right為空了,或者left為空了,導致沒有給h.next 賦值,所以,再這裡複製。

時間複雜度:o(logn)

空間複雜度:o(logn)

以上演算法的整體思想是:找到中心點,將鍊錶分割,將分割後的鍊錶排序,最後合併.

力扣 148 排序鍊錶

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

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