题目:

在 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 排序链表相关推荐

  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. 排序链表(归并排序、快速排序)

    文章目录 1. 题目 2. 解题 2.1 归并排序 2.2 快速排序 1. 题目 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1:输入: 4->2-> ...

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

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

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

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

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

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

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

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

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

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

  9. LeetCode Algorithm 148. 排序链表

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

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

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

最新文章

  1. 产品经理岗位职责说明_技术负责人岗位职责,五大方面,超越岗位抓住未来才是技术大牛...
  2. Java protect属性
  3. Javascript数组常见的方法
  4. win32 临界区和简单实例Demo(win32版)
  5. 如何汉化美化Citrix的WEB界面
  6. Spring Cloud Eureka(四):Eureka 配置参数说明
  7. 【Python】[02]初识Python
  8. VMware vCenter Converter 关闭SSL加密,提高35-40%性能
  9. luogu P1156 垃圾陷阱
  10. 2020行政区划重新划分_邯郸市的20年,2000年-2020年区划对比,你觉得成绩如何?...
  11. 一篇文章玩转世界最强音乐Spotify API操作
  12. wav格式怎么转换成flac?
  13. 少儿编程 电子学会图形化编程等级考试Scratch三级真题解析(判断题)2022年6月
  14. python脚本 游戏赚金币_Python实现王者荣耀刷金币脚本功能
  15. 电驴emule使用教程
  16. win7访问局域网计算机提示凭据,win7系统访问局域网共享文件时提示输入网络凭据的解决方法?...
  17. Heiro试用失败记
  18. pywifi破解密码
  19. 礼物说仿写项目iOS源码
  20. CAR-T细胞疗法最新研究进展

热门文章

  1. InfluxDB学习之InfluxDB常用函数(三)变换类函数
  2. 一次linux root密码错修改历程
  3. nginx模块nginx_upstream_check_module来检查后端服务器的健康情况
  4. c# 的多页打印 [用 PrintDocument 不用水晶报表]
  5. 水晶報表之Datetime TO shortDate
  6. 压测 broken pipe 之类
  7. Mac局域网本地库server, CornerStone使用
  8. 替换Mac的home brew源
  9. 半夜偷看“不良网站”,删除历史记录也没用,“坏影响”已悄然发生
  10. 滴滴这名员工的N+1飞了,离职带走公司文档