版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangshanfeng_/article/details/82530712
sort list
算法概论第一周
题目链接
题目描述
Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5
##题目分析
- 的复杂度,肯定要求要在原链表数据结构的基础上进行排序,将其转换为数组是开销很大的。
- 避免内存分配
##解题思路
- 标准的归并排序,原理如图:
- 同时要考虑链表的数据结构
- 故每次递归的过程分为找链表中点和排序
- 注意排序链表长度为0和1的特殊情况
- 注意两条链表同时排序后,剩下一小段链表的处理
##代码
class Solution {
public:
ListNode* sortList(ListNode* head) {
ListNode* fid = head;
int nodeNum = 0;
while(fid){
nodeNum++;
fid = fid->next;
}
if(nodeNum == 0 || nodeNum == 1)
return head;
else{
int halfNum = nodeNum / 2;
ListNode* fhalf = head;
for(int i = 0; i < halfNum - 1; i++){
fhalf = fhalf->next;
}
ListNode* rhalf = fhalf->next;
fhalf->next = NULL;
return merge(sortList(head), sortList(rhalf));
}
}
ListNode* merge(ListNode* l1, ListNode* l2){
ListNode* resHead = new ListNode(-1);
ListNode* resCurr = resHead;
while(l1 && l2){
if(l1->val < l2->val){
resCurr->next = l1;
l1 = l1->next;
}
else{
resCurr->next = l2;
l2 = l2->next;
}
resCurr = resCurr->next;
}
if(l1){
resCurr->next = l1;
}
else if(l2){
resCurr->next = l2;
}
return resHead->next;
}
};