LeetCode 148 排序链表
题目:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3 输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0 输出: -1->0->3->4->5
解题思路:
可达到O(nlogn)的排序我们知道有三种,堆排、快排、二路归并。 这里由于是链表,堆排和归并都不太容易操作。所以这里我们用二路归并算法。
二路归并有递归的和非递归的,这里单链表,用非递归较为简单。因为递归要比较两个区间的大小,这里需要用到双指针。
代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* sortList(ListNode* head) { 12 if(head == NULL) 13 return NULL; 14 ListNode *p = head; 15 int len = 0; 16 while(p) { 17 len++; 18 p = p->next; 19 } 20 21 ListNode *temp = new ListNode(0); 22 temp->next = head; 23 24 int interval; 25 for(interval = 1; interval <= len; interval *= 2) { //从下往上归并 26 27 ListNode *pre = temp; 28 ListNode *first = temp->next; 29 ListNode *second = temp->next; 30 31 while(first && second) { 32 int i = 0; 33 while(i < interval && second) { 34 second = second->next; 35 i++; 36 } 37 int fvisit = 0; 38 int svisit = 0; 39 while(fvisit < interval && svisit < interval && first && second) { 40 if(first->val < second->val) { //前指针较小,则把前指针装入放在前头 41 pre->next = first; 42 pre = first; 43 first = first->next; 44 fvisit++; 45 } 46 else { 47 pre->next = second; 48 pre = second; 49 second = second->next; 50 svisit++; 51 } 52 } 53 while(fvisit < interval && first) {//剩下的较大的就依次接上就好 54 pre->next = first; 55 pre = first; 56 first = first->next; 57 fvisit++; 58 } 59 while(svisit < interval && second) { 60 pre->next = second; 61 pre = second; 62 second = second->next; 63 svisit++; 64 } 65 pre->next = second; //往后继续直到第一次排序结束 66 first = second; 67 } 68 } 69 ListNode *ans = temp->next; 70 delete temp; 71 return ans; 72 } 73 };
转载于:https://www.cnblogs.com/moxiangfeng/p/10728639.html
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. 排序链表(归并排序、快速排序)
文章目录 1. 题目 2. 解题 2.1 归并排序 2.2 快速排序 1. 题目 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1:输入: 4->2-> ...
- Leetcode 148. 排序链表 解题思路及C++实现
解题思路: 对链表进行归并排序,使用 fast 和 slow 两个指针,遍历一次链表,就能将链表切分为两半,然后使用归并排序的方法. /*** Definition for singly-linked ...
- 83. Leetcode 148. 排序链表 (排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 .示例 1:输入:head = [4,2,1,3] 输出:[1,2,3,4] 示例 2:输入:head = [-1,5,3,4, ...
- leetcode 148. 排序链表(归并排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 示例 1: 输入:head = ...
- LeetCode —— 148. 排序链表(Python)
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入 ...
- 【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. 删除链表的中间节点 题目描述: ➡️挑战链接⬅️ 分析: 首先题目要求我们删 ...
最新文章
- 产品经理岗位职责说明_技术负责人岗位职责,五大方面,超越岗位抓住未来才是技术大牛...
- Java protect属性
- Javascript数组常见的方法
- win32 临界区和简单实例Demo(win32版)
- 如何汉化美化Citrix的WEB界面
- Spring Cloud Eureka(四):Eureka 配置参数说明
- 【Python】[02]初识Python
- VMware vCenter Converter 关闭SSL加密,提高35-40%性能
- luogu P1156 垃圾陷阱
- 2020行政区划重新划分_邯郸市的20年,2000年-2020年区划对比,你觉得成绩如何?...
- 一篇文章玩转世界最强音乐Spotify API操作
- wav格式怎么转换成flac?
- 少儿编程 电子学会图形化编程等级考试Scratch三级真题解析(判断题)2022年6月
- python脚本 游戏赚金币_Python实现王者荣耀刷金币脚本功能
- 电驴emule使用教程
- win7访问局域网计算机提示凭据,win7系统访问局域网共享文件时提示输入网络凭据的解决方法?...
- Heiro试用失败记
- pywifi破解密码
- 礼物说仿写项目iOS源码
- CAR-T细胞疗法最新研究进展
热门文章
- InfluxDB学习之InfluxDB常用函数(三)变换类函数
- 一次linux root密码错修改历程
- nginx模块nginx_upstream_check_module来检查后端服务器的健康情况
- c# 的多页打印 [用 PrintDocument 不用水晶报表]
- 水晶報表之Datetime TO shortDate
- 压测 broken pipe 之类
- Mac局域网本地库server, CornerStone使用
- 替换Mac的home brew源
- 半夜偷看“不良网站”,删除历史记录也没用,“坏影响”已悄然发生
- 滴滴这名员工的N+1飞了,离职带走公司文档