文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 归并排序
    • 2.2 快速排序

1. 题目

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:输入: 4->2->1->3
输出: 1->2->3->4
示例 2:输入: -1->5->3->4->0
输出: -1->0->3->4->5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 归并排序

参考单链表归并排序

class Solution {public:ListNode* sortList(ListNode* head) {if(head == NULL || head->next == NULL)return head;ListNode *fast = head->next, *slow = head, *rightHead;//fast初始化先走一步,偶数个链表时,防止一边0个,一边2个节点while(fast && fast->next){fast = fast->next->next;slow = slow->next;}rightHead = slow->next;slow->next = NULL;//先断开,再操作左右!!!ListNode *right = sortList(rightHead);ListNode *left = sortList(head);return merge(left, right);}ListNode* merge(ListNode *left, ListNode *right) {ListNode *emptyHead = new ListNode(0);//虚拟哨兵头ListNode *cur = emptyHead;while(left && right){if(left->val < right->val){cur->next = left;left = left->next;}else{cur->next = right;right = right->next;}cur = cur->next;}cur->next = (left == NULL ? right : left);cur = emptyHead->next;delete emptyHead;return cur;}
};

2.2 快速排序

class Solution {public:ListNode* sortList(ListNode *head) {quicksort(head, NULL);return head;}void quicksort(ListNode *head, ListNode *tail) {if(head == tail || head->next == NULL)return;ListNode *mid = partition(head,tail);quicksort(head, mid);quicksort(mid->next, tail);}ListNode* partition(ListNode *head, ListNode *tail){int pivot = head->val;ListNode *left = head, *cur = head->next;while(cur != NULL && cur != tail){if(cur->val < pivot){left = left->next;swap(cur->val, left->val);}cur = cur->next;}swap(left->val, head->val);return left;}
};

LeetCode 148. 排序链表(归并排序、快速排序)相关推荐

  1. 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表

    前言: 对于链表来说,排序首选应该是归并算法 维基百科上有归并算法的迭代版本和递归版本 基于数组实现的. https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B ...

  2. 【编程4】插入排序+快速排序+LeetCode.148(排序链表)

    文章目录 一.排序链表 1.题目描述--LeetCode.148 2.分析 (1)一般的快排 (2)解题思路 3.实现 二.排序算法 三.插入排序 1.基本思想 (1)过程概述 (2)具体算法描述: ...

  3. leetcode 148. 排序链表(归并排序)

    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 示例 1: 输入:head = ...

  4. Leetcode 148. 排序链表 解题思路及C++实现

    解题思路: 对链表进行归并排序,使用 fast 和 slow 两个指针,遍历一次链表,就能将链表切分为两半,然后使用归并排序的方法. /*** Definition for singly-linked ...

  5. LeetCode —— 148. 排序链表(Python)

    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入 ...

  6. 83. Leetcode 148. 排序链表 (排序)

    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 .示例 1:输入:head = [4,2,1,3] 输出:[1,2,3,4] 示例 2:输入:head = [-1,5,3,4, ...

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

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

  8. LeetCode Algorithm 148. 排序链表

    148. 排序链表 Ideas 链表结构的经典题目. 不过我不想用经典方法做,哎,就是皮. 我把链表元素都拷贝到数组中,然后对数组排序,之后再把排完序之后的值赋回去. 骚的一批. Code Pytho ...

  9. 2095. 删除链表的中间节点、19. 删除链表的倒数第 N 个结点、148. 排序链表

    LeetCode题解 1.2095. 删除链表的中间节点 2. 删除链表的倒数第 N 个结点 3.排序链表 1.2095. 删除链表的中间节点 题目描述: ➡️挑战链接⬅️ 分析: 首先题目要求我们删 ...

最新文章

  1. UVA 11020 - Efficient Solutions(set)
  2. Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决
  3. mac安装python3
  4. 【HDU - 6237】A Simple Stone Game(贪心,思维,素因子分解,数学)
  5. 如何做好一场技术演讲?
  6. Nature重磅综述|关于RNA-seq,你想知道的都在这(续)
  7. wireshark抓组播数据_HCIE学习笔记--组播路由协议PIM-DM工作机制解析
  8. 室内定位程序_基于增强现实的室内导航系统如何设计架构
  9. FFmpeg-2、编解码及视频像素格式尺寸转换和音频重采样
  10. Python collections.Counter()用法
  11. react中使用eslint+prettier+airbnb校验代码风格
  12. 高德地图做汽车路线规划的时候清除之前的路线
  13. android 扫描二维码支付,Android 扫码盒子全局接收付款码(全局事件上层接收多重下发)...
  14. ERP开发之看板展示
  15. 融云IM商用版冰点促销 助程序员的十二时辰躺赢
  16. 1074 链表翻转(柳神代码思路)yyds
  17. python下载所有股票日交易数据
  18. 词法分析——输入缓冲
  19. DigiPCBA设计工具初体验!!!
  20. PRML翻译 Chap1 Introduction

热门文章

  1. java 线程 状态 图_Java提高——多线程(一)状态图
  2. 服务器升级虚拟化,刀片服务器内置虚拟化 IBM升级服务器
  3. 句法依存分析_复旦大学邱锡鹏教授:词法、句法分析研究进展综述
  4. uC/OS-II源码分析(二)
  5. Linux的sort命令
  6. HTML静态网页---标签
  7. hdu 4280 最大流sap
  8. html中post和get区别
  9. oracle 从别的数据库获取数据 ,访问其他数据库
  10. boost学习之boost::lock_guardT与boost::unique_lockT的区别