前言:

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

或者看我整理的也可以

[leetcode]148. 排序链表


在leetcode写的第一个题解

解题思路

模仿中文维基百科写的

代码

/*** 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 || head->next == NULL){return head;}int len = 0;ListNode *p = head;while(p != NULL){//求链表长度len++;p = p->next;}//迭代归并排序ListNode *dummyHead = new ListNode(-1); // dummyHead->next = head;ListNode *leftPre = new ListNode(-1);ListNode *rightPre = new ListNode(-1);for(int seg = 1; seg < len; seg += seg){ListNode *pre = dummyHead;ListNode *left = pre->next;ListNode *right = pre->next;leftPre->next = left;rightPre->next = right;for(int start = 0; start < len; start += seg*2){                   int low = start;int mid = min(start + seg, len);int high = min(start + seg*2, len);int start1 = low, end1 = mid, len1 = end1 - start1;int start2 = mid, end2 = high;//先把左边断开len1 -= 1;   //while(len1 > 0){right = right->next;rightPre->next = right;len1--;}rightPre->next = right->next;right->next = NULL;    //断开,right现在指向leftPart最后一个节点right = rightPre->next;while(start1 < end1 && start2 < end2){if(left->val <= right->val){pre->next = left;pre = pre->next;left = left->next;leftPre->next = left;start1++; }else{pre->next = right;pre = pre->next;right = right->next;rightPre->next = right;start2++;}}while(start1 < end1){pre->next = left;pre = pre->next;left = left->next;start1++;}while(start2 < end2){pre->next = right;pre = pre->next;right = right->next;start2++;}//还本次剩下的部分的第一个节点指针,由right指着rightPre->next = right;left = right;leftPre->next = left;}}return dummyHead->next;}
};

链表排序---迭代版本归并算法 + [leetcode]148. 排序链表相关推荐

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

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

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

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

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

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

  4. 合并排序算法排序过程_基本算法:合并排序

    合并排序算法排序过程 每个程序员都需要了解他们的算法和数据结构. 在研究它们时,您需要确保确切了解它的功能,时间和空间的复杂性以及采用这种方式的原因,并且不仅能够对其进行编码,而且能够手动执行. 这就 ...

  5. java链表模型_Java数据结构和算法(七)——链表

    前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷.在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除效率都很低,并且数组在创建后,其大小是固定了,设置的过大会造 ...

  6. LeetCode 148. 排序链表(归并排序、快速排序)

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

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

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

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

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

  9. 【LeetCode 148】链表的归并排序

    上一篇文章用数组实现了二路归并排序,核心在于要对每次减半的元素进行实质性的改变,在数组中我们用临时数组记录每次merge的结果,在链表中用归并排序更加直接,因为我们操作的是结点的指针. 题目描述 难度 ...

最新文章

  1. Linux运维人员成长之路学习书籍推荐
  2. HDU2141(二分查找)
  3. 谈谈微服务设计中的API网关模式
  4. Swift实现CoreData存储数据
  5. C++ 使用消息派遣类解决处理消息判断
  6. k8s sealos应用安装及应用包制作教程
  7. python opencv图片放大 缩小_Python OpenCV之图片缩放的实现(cv2.resize)
  8. Javascript如何判断对象是否相等
  9. 缓存一致性协议MESI
  10. linux 第一个内核模块Hello World
  11. C#进阶之WebAPI(一)
  12. mysql做千万条压测数据
  13. NOIP2018游记题解
  14. ~~求欧拉函数(附模板题)
  15. Megcup2017 Dogfood
  16. 尴尬的风险管理如何深入下去-某公司为例
  17. 学习git reset 、 git checkout、git revert
  18. 消息生产与消息存储——kafka源码探究之三
  19. 爬虫 推送到discord_如何将自定义表情符号添加到Discord服务器
  20. 吉他效果器amplitube 4 mac 完整破解版永久激活方法

热门文章

  1. 学python后到底能干什么-学会Python后都能做什么?网友们的回答简直不要太厉害...
  2. 学python能做什么-学了Python都能干什么,哪个最赚钱?
  3. php和python-现在自学php和python那个合适?
  4. python基础知识-Python学习--最完整的基础知识大全
  5. qq语音识别_qq语音红包自动识别_qq语音红包一直未识别 - 云+社区 - 腾讯云
  6. 讯飞语音输入法免费版
  7. -bash: unzip: 未找到命令_29 条运维工程师必会实用 Linux 命令
  8. python数据包发送给云平台_用python发送短消息(基于阿里云平台)
  9. 解决从登录页通过this.$router.push跳转首页后 点返回健路由变而页面不变的问题
  10. 堆排序matlab,matlab 堆排序 ...原创(初来报到)