LeetCode 148 排序鍊錶

2022-06-10 06:03:10 字數 1331 閱讀 2714

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

輸出:

排序的演算法有很多,簡單的排序演算法有類似leetcode 147 對鍊錶進行插入排序。這裡要求時間複雜度為 \(o(n\log n)\),需要考慮稍微快一些的排序演算法,這裡採用歸併排序。

歸併排序並不複雜,但是與常見的陣列排序不同,陣列排序可以在 \(o(1)\) 的時間內找到陣列的中點,並進行遞迴。但是在鍊錶中需要找到中點,無法通過 \(o(1)\) 的複雜度直接查詢得到。

這裡採用 快慢指標 的方法來查詢鍊錶中點,定義 快指標 和 慢指標,快指標每次移動兩格,慢指標每次移動一格,快指標移動至末尾時,慢指標移動至中點。這裡可能需要細心一些來保證快慢指標不出錯。

class solution 

else

}if(p1) p->next = p1;

else if(p2) p->next = p2;

return dhead->next;

}listnode* mergesort(listnode* head)

listnode* h1 = head;

listnode* h2 = mid->next;

mid->next = nullptr;

return mergelist(mergesort(h1), mergesort(h2));

}public:

listnode* sortlist(listnode* head)

};/**

* definition for singly-linked list.

* struct listnode

* listnode(int x) : val(x), next(nullptr) {}

* listnode(int x, listnode *next) : val(x), next(next) {}

* };

*/

Leetcode 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在陣列儲存下的歸併排序,需要借出輔助空間完成,而鍊錶儲存的歸併排序,不需要借助輔助空間,直接在原來的鍊錶上進行操作,...

LeetCode 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歸併這裡我感覺有點不符合題意 不符合常數空間 如果是快排的話呢,交換節點還是很麻煩的,所以快排交換值了 癱.jpg cl...

leetcode148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5 看到題目就知道要二分,這裡用的是遞迴版歸併 definition for singly linked list....