[leetcode] 134 Sort List (链表 & 归并排序)
来源:互联网 发布:华为手机删除所有数据 编辑:程序博客网 时间:2024/06/09 19:41
首先看到题目中要求时间复杂度 O(n log n),时间复杂度为常数的时候,先将最容易实现的插入排序排除(O(n^2));接着想到快速排序和归并排序,
但是快速排序的最坏时间复杂度也为O(n^2),想了一会并且感觉也不是很好实现的样子。最后瞅了一眼discuss的代码,发现用的是归并排序,理论上归并排序的空间复杂度是线性的,也就是O(N),并不是常数,这点就需要结合链表的特性,只需要修改指针之间的关系就可以了,并不需要额外的空间开销,只需要new一个新的链表头即可。
由此分析,采用结合链表特性的归并排序是最好的方法。
我们使用归并排序时,先递归分解,每次分成两半,这里就需要用到追及法,也就是一个指针走2步,一个走一步,快的到末尾时,慢的正好到中间。
然后再使用merge函数由底至上归并为有序链表。具体看代码吧,注释很详细。
//归并排序(链表) class Solution {public: ListNode* sortList(ListNode* head) { if(head==NULL||head->next==NULL) //处理0个或1个的情况 return head; return mergeSort(head); //因为要递归本身,所以另写一个函数 } ListNode* mergeSort(ListNode* head) //递归分解 { if(head==NULL||head->next==NULL) return head; //追及法求中点 ListNode* p=head; ListNode* q=head; ListNode* p_pre=NULL; while(q!=NULL&&q->next!=NULL) { q=q->next->next; p_pre=p; //保存前半段的最后一个元素 p=p->next; } p_pre->next=NULL; ListNode* left=mergeSort(head); //递归前半段 ListNode* right=mergeSort(p); //递归后半段 return merge_top(left,right); } ListNode* merge_top(ListNode* left,ListNode*right) //对有序的进行归并 { ListNode* temp=new ListNode(0); ListNode* cur=temp; while(left!=NULL&&right!=NULL) { if(left->val<=right->val) { cur->next=left;//只需修改指针指向,无需开辟新的空间 left=left->next; } else { cur->next=right;right=right->next; } cur=cur->next; } if(left!=NULL) cur->next=left; else if(right!=NULL) cur->next=right; else cur->next=NULL; cur=temp->next; //返回第一个有内容的链表头部 delete temp;return cur; }};
1 0
- [leetcode] 134 Sort List (链表 & 归并排序)
- sort list leetcode (归并排序)
- Leetcode Sort List 链表归并排序
- Leetcode:Sort List 对单链表归并排序
- 【leetcode 单链表归并排序】Sort List
- 【LeetCode】 sort list 单链表的归并排序
- LeetCode Sort List(单链表归并排序)
- Leetcode: Sort List - 归并
- 归并排序---Sort List
- leetcode:Sort List(链表的归并排序)
- [C++]LeetCode: 125 Sort List (归并排序链表)
- LeetCode Sort List 链表的归并排序
- leetcode:Sort List 使用归并排序的解决思路
- LeetCode 148. Sort List 解题报告(归并排序小结)
- leetcode 148. Sort List 链表归并排序
- Sort List 归并排序链表
- 148. Sort List 链表归并排序
- Sort List —— 归并排序
- JIRA项目的对应流程
- 国家机构支持广电,盒子之死
- url解析函数
- IOS事件分发、Responder Chain(一)——hit-testing
- Qt环境搭建(Qt Creator)
- [leetcode] 134 Sort List (链表 & 归并排序)
- pageX,clientX,offsetX,layerX的区别
- 【南大软院大神养成计划】html5标签学习(一)
- 《创业笔记》笔记3
- 深入解析java虚拟机-jvm运行机制
- HTTP 方法GET 和 POST区别
- mac命令终端配置adb
- 开启Python的学习路程
- 3种盒内元素两端对齐方案