目錄
一、題目描述
二、解題思路
三、**實現
給你鍊錶的頭結點 head ,請將其按公升序排列並返回排序後的鍊錶。
高階:
示例 1:
輸入:head = [4,2,1,3]示例 2:輸出:[1,2,3,4]
輸入:head = [-1,5,3,4,0]示例 3:輸出:[-1,0,3,4,5]
輸入:head =從常規的排序演算法入手,快排的平均時間複雜度為logn級別,但是最壞可以達到二次方級別,空間要求為常數;歸併排序時間複雜度滿足要求,但常規的空間複雜度為logn級別。綜上,常規的這兩種都不是最符合題目要求的,但是提交都是可以通過的。輸出:
要完全符合要求的話,需要對歸併排序進行修改,不能使用遞迴的歸併,需要改為迭代。方式為將鍊錶劃分為一段一段有序的短鍊錶,將短鍊錶逐步合併為有序的長鍊錶,當鍊表長度為1時,是有序的。所以短鏈的長度依次區1,2,4,8…逐步合併,最終有序。
下面用c++把上述方法依次實現一遍
#includeusing namespace std;
struct listnode
listnode(int x) : val(x), next(nullptr) {}
listnode(int x, listnode *next) : val(x), next(next) {}
};listnode* partition(listnode* low, listnode* high)
quick = quick->next;
} //把基準值放在正確的位置
swap(low->val, slow->val);
return slow;
}//方法一:鍊錶快排
void quicksortlist(listnode* low, listnode* high)
//方法二:鍊錶歸併排序
listnode* mergelist(listnode* head1, listnode* head2) else
newhead = newhead->next;
} if (tmp1)
if (tmp2)
return res->next;
}listnode* mergesort(listnode* head, listnode* tail)
listnode* mid = slow->next;
slow->next = nullptr;
return mergelist(mergesort(head, slow->next), mergesort(mid, tail));
}listnode* sortlist(listnode* head)
//題解所述方法:自低向上歸併
//sublength = 1: (3->4)->(1->7)->(8->9)->(2->11)->(5->6)
//sublength = 2 : (1->3->4->7)->(2->8->9->11)->(5->6)
//sublength = 4 : (1->2->3->4->7->8->9->11)->(5->6)
//sublength = 8 : (1->2->3->4->5->6->7->8->9->11)
listnode* sortlist1(listnode* head)
int length = 0;
listnode* node = head;
while (node != nullptr)
listnode* dummyhead = new listnode(0, head);
for (int sublength = 1; sublength < length; sublength <<= 1)
listnode* head2 = curr->next;
curr->next = nullptr;
curr = head2;
for (int i = 1; i < sublength && curr != nullptr && curr->next != nullptr; i++)
listnode* next = nullptr;
if (curr != nullptr)
listnode* merged = mergelist(head1, head2);
prev->next = merged;
while (prev->next != nullptr)
curr = next;
} }return dummyhead->next;
}int main()
return 0;
}
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....