LeetCode 148. 排序链表(归并排序、快速排序)
文章目录
- 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. 排序链表(归并排序、快速排序)相关推荐
- 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表
前言: 对于链表来说,排序首选应该是归并算法 维基百科上有归并算法的迭代版本和递归版本 基于数组实现的. https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B ...
- 【编程4】插入排序+快速排序+LeetCode.148(排序链表)
文章目录 一.排序链表 1.题目描述--LeetCode.148 2.分析 (1)一般的快排 (2)解题思路 3.实现 二.排序算法 三.插入排序 1.基本思想 (1)过程概述 (2)具体算法描述: ...
- leetcode 148. 排序链表(归并排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 示例 1: 输入:head = ...
- Leetcode 148. 排序链表 解题思路及C++实现
解题思路: 对链表进行归并排序,使用 fast 和 slow 两个指针,遍历一次链表,就能将链表切分为两半,然后使用归并排序的方法. /*** Definition for singly-linked ...
- LeetCode —— 148. 排序链表(Python)
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入 ...
- 83. Leetcode 148. 排序链表 (排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 .示例 1:输入:head = [4,2,1,3] 输出:[1,2,3,4] 示例 2:输入:head = [-1,5,3,4, ...
- 【LeetCode】【HOT】148. 排序链表(归并排序)
[LeetCode][HOT]148. 排序链表 文章目录 [LeetCode][HOT]148. 排序链表 package hot;import java.util.Arrays;class Lis ...
- LeetCode Algorithm 148. 排序链表
148. 排序链表 Ideas 链表结构的经典题目. 不过我不想用经典方法做,哎,就是皮. 我把链表元素都拷贝到数组中,然后对数组排序,之后再把排完序之后的值赋回去. 骚的一批. Code Pytho ...
- 2095. 删除链表的中间节点、19. 删除链表的倒数第 N 个结点、148. 排序链表
LeetCode题解 1.2095. 删除链表的中间节点 2. 删除链表的倒数第 N 个结点 3.排序链表 1.2095. 删除链表的中间节点 题目描述: ➡️挑战链接⬅️ 分析: 首先题目要求我们删 ...
最新文章
- UVA 11020 - Efficient Solutions(set)
- Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决
- mac安装python3
- 【HDU - 6237】A Simple Stone Game(贪心,思维,素因子分解,数学)
- 如何做好一场技术演讲?
- Nature重磅综述|关于RNA-seq,你想知道的都在这(续)
- wireshark抓组播数据_HCIE学习笔记--组播路由协议PIM-DM工作机制解析
- 室内定位程序_基于增强现实的室内导航系统如何设计架构
- FFmpeg-2、编解码及视频像素格式尺寸转换和音频重采样
- Python collections.Counter()用法
- react中使用eslint+prettier+airbnb校验代码风格
- 高德地图做汽车路线规划的时候清除之前的路线
- android 扫描二维码支付,Android 扫码盒子全局接收付款码(全局事件上层接收多重下发)...
- ERP开发之看板展示
- 融云IM商用版冰点促销 助程序员的十二时辰躺赢
- 1074 链表翻转(柳神代码思路)yyds
- python下载所有股票日交易数据
- 词法分析——输入缓冲
- DigiPCBA设计工具初体验!!!
- PRML翻译 Chap1 Introduction
热门文章
- java 线程 状态 图_Java提高——多线程(一)状态图
- 服务器升级虚拟化,刀片服务器内置虚拟化 IBM升级服务器
- 句法依存分析_复旦大学邱锡鹏教授:词法、句法分析研究进展综述
- uC/OS-II源码分析(二)
- Linux的sort命令
- HTML静态网页---标签
- hdu 4280 最大流sap
- html中post和get区别
- oracle 从别的数据库获取数据 ,访问其他数据库
- boost学习之boost::lock_guardT与boost::unique_lockT的区别