文章目录

  • 1 题目
  • 2 解决方案
    • 2.1 思路
    • 2.2 时间复杂度
    • 2.4 空间复杂度
  • 3 源码

1 题目

题目:链表排序(Sort List)
描述:在 O(nlogn) 时间复杂度和常数级的空间复杂度下给链表排序。

lintcode题号——98,难度——medium

样例1:

输入:list = 1->3->2->null
输出:1->2->3->null
解释:给链表排序.

样例2:

输入:list = 1->7->2->6->null
输出:1->2->6->7->null
解释:给链表排序.

2 解决方案

2.1 思路

  题目要求排序,在O(nlogn)时间复杂度内,空间复杂度要求常数级,满足时间复杂度的排序可以想到快速排序和归并排序,满足空间复杂度的只有快速排序,但题目排序的对象是链表,归并排序在数组上的空间复杂度是O(n),但对链表排序时不需要额外的数据结构来存储临时数据,所以在链表上的归并排序的空间复杂度只有O(1),本题使用快排和归并都可以。

2.2 时间复杂度

  时间复杂度为O(n * log n)。

2.4 空间复杂度

  空间复杂度为O(1)。

3 源码

细节:

  1. 使用快、慢指针的方式来找链表的中点。
  2. fast指针起点位置向后移动一位,符合整数计算偏左的特点,且不用特殊处理链表长度为2的情况。
  3. 递归时先处理后半段,再将中点赋空,断开后半段,再处理前半段。

C++版本:

/**
* Definition of singly-linked-list:
* class ListNode {
* public:
*     int val;
*     ListNode *next;
*     ListNode(int val) {
*        this->val = val;
*        this->next = NULL;
*     }
* }
*/
/**
* @param head: The head of linked list.
* @return: You should return the head of the sorted linked list, using constant space complexity.
*/
ListNode* sortList(ListNode *head) {// write your code hereif (head == nullptr || head->next == nullptr) // 跳过链表长度为0和1的情况{return head;}// 找到链表中点ListNode * mid = head;ListNode * fast = head->next; // fast指针起点位置向后移动一位,符合整数计算偏左的特点,且不用特殊处理链表长度为2的情况while (fast != nullptr && fast->next != nullptr){mid = mid->next;fast = fast->next->next;}ListNode * right = sortList(mid->next); // 先排后半段mid->next = nullptr; // 断开后半段ListNode * left = sortList(head); // 再排前半段return mergeTwoSortedList(left, right);
}ListNode * mergeTwoSortedList(ListNode * left, ListNode * right)
{if (left == nullptr){return right;}if (right == nullptr){return left;}ListNode dummyNode(0);ListNode * cur = &dummyNode;while (left != nullptr && right != nullptr){if (left->val < right->val){cur->next = left;left = left->next;cur = cur->next;}else{cur->next = right;right = right->next;cur = cur->next;}}if (left != nullptr){cur->next = left;}if (right != nullptr){cur->next = right;}return dummyNode.next;
}

50 链表排序(Sort List)相关推荐

  1. java列表排序sort_java list(java list排序sort升序、降序)

    javalist List是Java中比较常用的调集类,关于List接口有许多完成类,本文就来简略介绍下其间几个重点的完成ArrayList.LinkedList和Vector之间的联系和差异. Li ...

  2. 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)

    这篇文章分析一下链表的各种排序方法. 以下排序算法的正确性都可以在LeetCode的链表排序这一题检测.本文用到的链表结构如下(排序算法都是传入链表头指针作为参数,返回排序后的头指针) struct ...

  3. 单链表排序----快排 归并排序

    单链表排序----快排 & 归并排序 原文:http://blog.csdn.net/u012658346/article/details/51141288 题目描述:  给定一个乱序的单链表 ...

  4. 链表排序(C语言)选择排序

    #include <stdio.h> #include <stdlib.h> #include <time.h> //用到了time函数#define arrayS ...

  5. [转载]详细解说STL排序(sort)------这篇博文在一道题上救了我o_0

    详细解说 STL 排序(Sort) 作者Winter 原文地址:http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序 ...

  6. c语言编程单向链表排序,【分享】C语言 简单链表创建 排序 输出

    [Asm] 纯文本查看 复制代码#include #include//为动态分配提供函数库 typedef struct node { int num;//数据域 struct node *next; ...

  7. 【阿里面试】链表排序总结

    题目:对单链表进行排序,要求不改变每个节点内的值. 1.首先自然而然地会想到快速排序,毕竟是一个经典的排序算法.但是在排序过程中要求不能改变节点中的值,就必须通过改变节点中的指针来交换节点.而且快速排 ...

  8. 单链表的应用--对单链表排序

      对单链表进行排序,利用前文写好的链表的框架,在链表类中补充Sort方法. 对单链表排序 一.问题分析 二.代码分析 1.链表类LinkList 2.链表方法Sort 三.测试代码 1.主函数 2. ...

  9. 面试题精选:单链表排序也能玩出花来

    今天国庆节,祝大家中秋节快乐,顺便给大家拜个早年[狗头].不过最近还在准备面试的同学们不要浪太狠,还是要好好学习的鸭. 单链表的排序在数据结构类的面试题中简直是集大成者,什么排序.链表.链表删除.添加 ...

  10. SE API第10/11天:集合 ——>ArrayListals、Iterator遍历迭代器、增强for、List集→subList、集合间转换asList、排序sort | Map相关

    一.Java 集合框架 0.介绍: (0)什么是集合 -集合与数组一样,可以保存一组元素,并且提供了操作元素的相关方法,使用更方便. (1)集合框架被设计成要满足以下几个目标: 该框架必须是高性能的. ...

最新文章

  1. MySQL - order by和 group by 优化初探
  2. Android“应用克隆”漏洞分析
  3. 【Codeforces Round #430 (Div. 2) B】Gleb And Pizza
  4. 计算机科学文章,计算机科学导论论文范文
  5. 微信生成专属海报(专属二维码)
  6. 小程序(仿微信发布说说功能)
  7. 设计模式—抽象工厂模式(思维导图)
  8. docker代理配置详解
  9. 苹果手机java设置_苹果java文件怎么打开?苹果手机安装JAVA程序的方法
  10. 计算机sci论文中的图,一篇计算机sci论文的发表过程
  11. android 卡片消息,安卓QNotified 支持xml卡片QQ消息 - 陌路人博客
  12. 2021全国电赛H题回顾
  13. Android播放器实现横竖屏切换
  14. Anbox 容器管理服务
  15. 关于POE的知识都在这里了
  16. LaTeX之双栏模板表格布局(单双栏满宽+不满宽)
  17. 史上最全网络安全面试题总结
  18. 怎么对接个人收款支付接口(扫码支付)
  19. 转:明茨伯格:管理者的“选“、“育“、“评”
  20. 五类、超五类、六类跳线

热门文章

  1. Windows 域时间同步
  2. 汽车自动驾驶是人工智能吗,自动驾驶是人工智能
  3. 基于javaweb+jsp的在线书城书店系统(java+jdbc+Servlet+mysql)
  4. Windows 下载安装 Seata
  5. 记Thinkpad的一次扩容升级经历
  6. c#html表格样式大全,table完美css样式,table的基本样式,table样式
  7. 零基础简单易用的EmberJS框架
  8. ruby通过ftp下载文件
  9. 【Power Automate】在power automate中使用SharePoint rest api(Send an http request to SharePoint)获取列表数据
  10. 金蝶K3系统的网络服务端口