Sort a linked list in O(n log n) time using constant space complexity.

链表排序可以用很多方法,插入,冒泡,选择都可以,也容易实现,但是复杂度不符合题意要求。

然后时间复杂度在O(nlogn)的排序算法中,堆排序,快速排序,归并排序。

  • 堆排序,主要是基于数组的,这里是链表,实现起来比较麻烦。
  • 快速排序,快速排序最坏情况的时间复杂度是O(n2)
  • 归并排序,在对数组的归并排序中,是有O(n)的空间复杂度的,但是链表可以不需要,我们可以用构造虚拟节点法

就地合并两个有序链表。

因此,我们就选择用归并排序来解决这道题,合并两个有序链表将作为链表常见算法题之一,在算法总结那篇文章中会出现。

归并的核心思想就是divide-merge。如何divide,又涉及到链表常见算法——找到中间节点。找到中间节点后,即可把链表

划分成两个链表,然后再合并。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {if(head==NULL||head->next==NULL)return head;return MergeSort(head);}
/*    ListNode* Merge(ListNode* r,ListNode* l){if(r==NULL||l==NULL)return r?r:l;ListNode*p,*q;if(r->val<l->val){p=r;q=l;}else{p=l;q=r;}ListNode head=p;ListNode* tmp=r;ListNode* bf=p;while(p&&q){if(p->val<q->val){bf=p;p=p->next;}else{tmp=q;q=q->next;bf->next=tmp;}}if(!q){bf->next=q;}return head;}*/ListNode * Merge(ListNode *lh, ListNode *rh){ListNode *temp=new ListNode(0);ListNode *p=temp;while(lh&&rh){if(lh->val<=rh->val){p->next=lh;lh=lh->next;}else{p->next=rh;rh=rh->next;}p=p->next;}if(!lh)p->next=rh;elsep->next=lh;p=temp->next;temp->next=NULL;delete temp;return p;}ListNode* MergeSort(ListNode* head){if(head==NULL||head->next==NULL)return head;ListNode* p=head;ListNode* middle=head,*pre=NULL;;while(p&&p->next!=NULL){p=p->next->next;pre=middle;middle=middle->next;}pre->next=NULL;head=MergeSort(head);middle=MergeSort(middle);return Merge(head,middle);}
};

转载于:https://www.cnblogs.com/LUO77/p/5666587.html

【leetcode】148. Sort List相关推荐

  1. 【leetcode】75. Sort Colors

    题目如下: 解题思路:我的解题思路是遍历数组,遇到0删除该元素并插入到数组头部,遇到1则不处理,遇到2删除该元素并插入到数组尾部. 代码如下: class Solution(object):def s ...

  2. 【LeetCode】【HOT】148. 排序链表(归并排序)

    [LeetCode][HOT]148. 排序链表 文章目录 [LeetCode][HOT]148. 排序链表 package hot;import java.util.Arrays;class Lis ...

  3. 【LeetCode】【HOT】49. 字母异位词分组(递归)

    [LeetCode][HOT]49. 字母异位词分组 文章目录 [LeetCode][HOT]49. 字母异位词分组 package hot;import java.util.ArrayList; i ...

  4. 【LeetCode】剑指 Offer 45. 把数组排成最小的数

    [LeetCode]剑指 Offer 45. 把数组排成最小的数 文章目录 [LeetCode]剑指 Offer 45. 把数组排成最小的数 package offer;import java.uti ...

  5. 【LeetCode】剑指 Offer 61. 扑克牌中的顺子

    [LeetCode]剑指 Offer 61. 扑克牌中的顺子 文章目录 [LeetCode]剑指 Offer 61. 扑克牌中的顺子 一.集合Set + 遍历 二.排序 + 遍历 总结 解题思路 根据 ...

  6. 【LeetCode】《剑指Offer》第Ⅴ篇⊰⊰⊰ 39 - 47题

    [LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 文章目录 [LeetCode]<剑指Offer>第Ⅴ篇⊰⊰⊰ 39 - 47题 39. 数组中出现次数超过 ...

  7. 【LeetCode】《剑指Offer》第Ⅰ篇⊰⊰⊰ 3 - 11题

    [LeetCode]<剑指Offer>第Ⅰ篇⊰⊰⊰ 3 - 11题 文章目录 [LeetCode]<剑指Offer>第Ⅰ篇⊰⊰⊰ 3 - 11题 03. 数组中重复的数字(ea ...

  8. 【LeetCode】重复元素相关题目

    [LeetCode]重复元素相关题目 文章目录 [LeetCode]重复元素相关题目 存在重复元素★ 存在重复元素 II★ 存在重复元素 III★★ 重复 N 次的元素★ 寻找重复数★★ 存在重复元素 ...

  9. 【Leetcode】最长递增子序列问题及应用

    文章目录 最长递增子序列问题及应用 300. 最长递增子序列 面试题 17.08. 马戏团人塔 354. 俄罗斯套娃信封问题 面试题 08.13. 堆箱子 1691. 堆叠长方体的最大高度 406. ...

最新文章

  1. jdbc mysql 实例名_JDBC连接自定义sqlserver数据库实例名(多个实例)
  2. 《学习OpenCV3(中文版)》图书目录
  3. gbdt如何处理多分类问题(multiclass,cart)
  4. DCMTK:DSRTree和DSRTreeNodeCursor类的测试程序
  5. android 属性动画伸缩,Android的属性动画(二)加载框圆点旋转收缩放大缩小效果的实现...
  6. classcastexception异常_内部类、异常以及 LeetCode 每日一题
  7. rabbitmq详细入门文档+springboot结合使用
  8. hbase 修改表名_hbase修改表名 - 张欢19933的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. java异常处理简介_【自学java】异常处理简介
  10. SpringMVC 使用注解时控制器传参
  11. linux无密码ssh,scp,rsync
  12. WebSocket(伍) 断开连接
  13. android手机状态解释,比方android.os.Build.VERSION.SDK
  14. 通过sql server的作业调度+存储过程来实现系统定时任务的方法
  15. SAP 打印自动导出PDF本地文件(自己做的例子)
  16. 响应式圣经:10W字,实现Spring响应式编程自由
  17. Zabbix 地址Ping检测告警
  18. 文字内容超出两行时显示省略号
  19. Linux WIFI 驱动
  20. PB控件属性之Graph

热门文章

  1. Spring Boot 搭建 ELK,这才是正确看日志的方式!
  2. 我要狠狠的反驳“公司禁止使用Lombok”的观点
  3. 5分钟实现SpringBoot整合Dubbo构建分布式服务
  4. TDSQL在微众银行的大规模实践之路
  5. 经典面试题: 为啥 ConcurrentHashMap 读操作不需要加锁?
  6. 83篇文献-万字总结强化学习之路
  7. AI总监王长虎被曝离职,字节跳动AI Lab 再失一将!
  8. 悉尼科技大学入选 CVPR 2021 的 9 篇论文,都研究什么?
  9. 活久见!谷歌开源“大杀器”,CV、NLP都能用!
  10. 新款华为手机,免费带回家