50 链表排序(Sort List)
文章目录
- 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 源码
细节:
- 使用快、慢指针的方式来找链表的中点。
- fast指针起点位置向后移动一位,符合整数计算偏左的特点,且不用特殊处理链表长度为2的情况。
- 递归时先处理后半段,再将中点赋空,断开后半段,再处理前半段。
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)相关推荐
- java列表排序sort_java list(java list排序sort升序、降序)
javalist List是Java中比较常用的调集类,关于List接口有许多完成类,本文就来简略介绍下其间几个重点的完成ArrayList.LinkedList和Vector之间的联系和差异. Li ...
- 链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
这篇文章分析一下链表的各种排序方法. 以下排序算法的正确性都可以在LeetCode的链表排序这一题检测.本文用到的链表结构如下(排序算法都是传入链表头指针作为参数,返回排序后的头指针) struct ...
- 单链表排序----快排 归并排序
单链表排序----快排 & 归并排序 原文:http://blog.csdn.net/u012658346/article/details/51141288 题目描述: 给定一个乱序的单链表 ...
- 链表排序(C语言)选择排序
#include <stdio.h> #include <stdlib.h> #include <time.h> //用到了time函数#define arrayS ...
- [转载]详细解说STL排序(sort)------这篇博文在一道题上救了我o_0
详细解说 STL 排序(Sort) 作者Winter 原文地址:http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序 ...
- c语言编程单向链表排序,【分享】C语言 简单链表创建 排序 输出
[Asm] 纯文本查看 复制代码#include #include//为动态分配提供函数库 typedef struct node { int num;//数据域 struct node *next; ...
- 【阿里面试】链表排序总结
题目:对单链表进行排序,要求不改变每个节点内的值. 1.首先自然而然地会想到快速排序,毕竟是一个经典的排序算法.但是在排序过程中要求不能改变节点中的值,就必须通过改变节点中的指针来交换节点.而且快速排 ...
- 单链表的应用--对单链表排序
对单链表进行排序,利用前文写好的链表的框架,在链表类中补充Sort方法. 对单链表排序 一.问题分析 二.代码分析 1.链表类LinkList 2.链表方法Sort 三.测试代码 1.主函数 2. ...
- 面试题精选:单链表排序也能玩出花来
今天国庆节,祝大家中秋节快乐,顺便给大家拜个早年[狗头].不过最近还在准备面试的同学们不要浪太狠,还是要好好学习的鸭. 单链表的排序在数据结构类的面试题中简直是集大成者,什么排序.链表.链表删除.添加 ...
- SE API第10/11天:集合 ——>ArrayListals、Iterator遍历迭代器、增强for、List集→subList、集合间转换asList、排序sort | Map相关
一.Java 集合框架 0.介绍: (0)什么是集合 -集合与数组一样,可以保存一组元素,并且提供了操作元素的相关方法,使用更方便. (1)集合框架被设计成要满足以下几个目标: 该框架必须是高性能的. ...
最新文章
- MySQL - order by和 group by 优化初探
- Android“应用克隆”漏洞分析
- 【Codeforces Round #430 (Div. 2) B】Gleb And Pizza
- 计算机科学文章,计算机科学导论论文范文
- 微信生成专属海报(专属二维码)
- 小程序(仿微信发布说说功能)
- 设计模式—抽象工厂模式(思维导图)
- docker代理配置详解
- 苹果手机java设置_苹果java文件怎么打开?苹果手机安装JAVA程序的方法
- 计算机sci论文中的图,一篇计算机sci论文的发表过程
- android 卡片消息,安卓QNotified 支持xml卡片QQ消息 - 陌路人博客
- 2021全国电赛H题回顾
- Android播放器实现横竖屏切换
- Anbox 容器管理服务
- 关于POE的知识都在这里了
- LaTeX之双栏模板表格布局(单双栏满宽+不满宽)
- 史上最全网络安全面试题总结
- 怎么对接个人收款支付接口(扫码支付)
- 转:明茨伯格:管理者的“选“、“育“、“评”
- 五类、超五类、六类跳线
热门文章
- Windows 域时间同步
- 汽车自动驾驶是人工智能吗,自动驾驶是人工智能
- 基于javaweb+jsp的在线书城书店系统(java+jdbc+Servlet+mysql)
- Windows 下载安装 Seata
- 记Thinkpad的一次扩容升级经历
- c#html表格样式大全,table完美css样式,table的基本样式,table样式
- 零基础简单易用的EmberJS框架
- ruby通过ftp下载文件
- 【Power Automate】在power automate中使用SharePoint rest api(Send an http request to SharePoint)获取列表数据
- 金蝶K3系统的网络服务端口