对于链表的排序问题,想找一种时间复杂度为O(nlogn),空间复杂度O(1)的算法。该问题源自于Leetcode,Sort a linked list in O(n log n) time using constant space complexity.

首先想到了归并排序,因为链表的归并不需要辅助空间。

思路:和数组的二路归并基本一致。

所不同的是:

1、要遍历一遍才能找到中间位置。

2、首尾位置都要记下来,因为链表不是自然相邻的。所以排序后返回时要返回首尾结点的新指针。

3、遍历查找时也要注意链表结尾判定可能不再是NULL。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *sortList(ListNode *head) {if(head == NULL)return NULL;ListNode *end = head;while(end->next != NULL)end = end->next;sort(head, end);return head;}void sort(ListNode* &left, ListNode* &right){if(left == right)return;//寻找中间位置ListNode *p1, *p2;p1 = p2 = left;while(p2 != right && p2->next != right){p1 = p1->next;p2 = p2->next->next;}p2 = p1->next;//递归分治sort(left, p1);sort(p2, right);p1->next = NULL;right->next = NULL;//归并ListNode *new_start,*new_end, *tmp;if(left->val < p2->val){new_start = left;left = left->next;}else{new_start = p2;p2 = p2->next;}tmp = new_start;while(left != NULL && p2 != NULL){if(left->val < p2->val){tmp->next = left;tmp = left;left = left->next;}else{tmp->next = p2;tmp = p2;p2 = p2->next;}}if(left != NULL){tmp->next = left;new_end = p1;}else{tmp->next = p2;new_end = right;}//返回新链表头和链表尾left = new_start;right = new_end;right->next = NULL;}
};

PS:链表的排序用快速排序应该也可以做到。

链表的二路归并排序 Sort List相关推荐

  1. Sort List(二路归并排序)

    题目链接:https://leetcode.com/problems/sort-list/description/ 题目要求:对链表进行排序,时间复杂度O(n),常数的空间复杂度 两种解法,本质上都是 ...

  2. 二路归并排序Python实现-III

    二路归并排序Python实现-III 归并排序 是一种 效率比较高并且稳定的算法.时间复杂度 O(NLog(N)),空间复杂度 O(N). 归并排序(Merge Sort)是建立在归并操作上的一种有效 ...

  3. 二路归并排序 Implemented With C++

    文章目录 Definition Implementation Performance Definition 对于一个长度为 n n n 的表,我们可以把这张表看成是由 n n n 个长度为 1 1 1 ...

  4. 数据结构源码笔记(C语言):二路归并排序

    //实现二路归并排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20 //线性表中最多元素个数typedef int ...

  5. 二路归并排序简介及其并行化

    1.归并排序简介 1.1算法思想 归并排序属于比较类非线性时间排序,比较类排序中性能最佳,应用较为广泛. 归并排序是分治法(Divide and Conquer)的一个典型的应用.将已有序的子序列合并 ...

  6. C++实现二路归并排序算法

    排序算法分为五大类,一共是有九种,如下: 插入类:直接插入排序.折半插入排序.希尔排序 交换类:冒泡排序.快速排序 选择类:简单选择排序.堆排序 归并类:二路归并排序 基数类:多关键字排序 九种算法的 ...

  7. 二路归并排序原理及JAVA实现

    归并类排序 基本思想:首先将原始无序序列划分为两个子序列,然后分别对每个子序列递归地进行排序,最后再将有序子序列合并. 归并排序基于分治策略思想.前面提到的基于分治的快速排序重在"分&quo ...

  8. 二路归并排序及时间复杂度分析

    序言 二路归并排序是一种效率极高的递归排序,将数组A化为有序数组时间复杂度为O(nlogn). 思想 二路归并排序分为拆分数组以及合并两个操作. 切分(自上而下)时间复杂度2*T(n/2) 每次从数组 ...

  9. 数据结构——二路归并排序和基数排序

    二路归并排序 算法原理 假设该数组为q,左边界为 l,右边界为 r,并设置临时数组tmp. 采用分治思想: 第一步:确定分界点: mid = l + r >>1. 第二步:递归划分左右两段 ...

最新文章

  1. python商业爬虫教程_廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程...
  2. 这个开源项目帮你将Linux命令行一网打尽!
  3. About Me - 关于
  4. 今日头条核心技术“个性推荐算法”揭秘
  5. 加加减减的奥秘——从数学到魔术的思考(三)
  6. jupyter notebook python怎么设置_jupyter notebook 的工作空间设置操作
  7. Spring集成PageHelper的简单用法
  8. 【bzoj 4390】 [Usaco2015 dec]Max Flow(树上差分)
  9. 使用httpwatch抓包
  10. large_margin
  11. Megcup 2017 决赛第一题 规则
  12. 漏洞解决方案-敏感信息脱敏显示
  13. 数学建模常用算法—灰色预测
  14. Teigha的BlockTableRecord获取方法
  15. 力扣题解: 55. 跳跃游戏
  16. 2021年东莞高新企业补贴政策
  17. 那些工作中一不留神埋的雷
  18. 2021/12/01学习总结
  19. 如何能够让博客被百度等搜索到
  20. IOC容器(详细讲解)

热门文章

  1. PCI DSS不合规的处理方法
  2. tp5结合es6.x的基本用法
  3. 更换新口号 ,发力雄安,李彦宏在百度AI的黎明回望初心
  4. java建立一个小小留言板
  5. FastClick 填坑及源码解析
  6. html中如何写div中div的位置,DIV CSS绝对定位布局案例 position布局实例
  7. python networkx案例_Python包 - networkx
  8. 一个屌丝程序员的青春(六六)
  9. HTML 单选按钮实现 (性别选择)(解读)
  10. 一文掌握FastDeploy Serving服务化部署(打造线上证件照制作系统,含完整代码)