在 O(n log n) 時間複雜度和常數級空間複雜度下,對鏈表進行排序。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
思路:這個時間複雜度,肯定是要用歸併排序,快速排序,堆排序之一的排序的算法。
先寫歸併排序: 歸併排序的核心就是從中間分,分,分,然後合併。有一點要注意的是:拆分的時候有要把鏈表分開,藉助cur指針。
C++ 代碼如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
ListNode* merge(ListNode* l1,ListNode* l2) //相當於兩個有序鏈表的合併
{
ListNode *start = new ListNode(0);
ListNode *tail =start;
while(l1 && l2)
{
if(l1->val < l2->val)
{
tail->next = l1;
l1=l1->next;
}
else{
tail->next =l2;
l2 = l2->next;
}
tail =tail->next;
}
if(l1) tail->next = l1;
if(l2) tail->next = l2;
return start->next;
}
public:
ListNode* sortList(ListNode* head) { //有一個問題在於要把鏈表從中間斷開
if(!head ||!head->next) return head;
//找到中間結點
ListNode *fast=head , *slow=head, *cur=NULL;
while(fast && fast->next)
{
cur = slow;
fast=fast->next->next;
slow= slow->next;
}
cur->next = NULL;
return merge(sortList(head),sortList(slow));
}
};