链表排序---迭代版本归并算法 + [leetcode]148. 排序链表
前言:
对于链表来说,排序首选应该是归并算法
维基百科上有归并算法的迭代版本和递归版本 基于数组实现的。
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. 排序链表相关推荐
- 【编程4】插入排序+快速排序+LeetCode.148(排序链表)
文章目录 一.排序链表 1.题目描述--LeetCode.148 2.分析 (1)一般的快排 (2)解题思路 3.实现 二.排序算法 三.插入排序 1.基本思想 (1)过程概述 (2)具体算法描述: ...
- 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, ...
- 合并排序算法排序过程_基本算法:合并排序
合并排序算法排序过程 每个程序员都需要了解他们的算法和数据结构. 在研究它们时,您需要确保确切了解它的功能,时间和空间的复杂性以及采用这种方式的原因,并且不仅能够对其进行编码,而且能够手动执行. 这就 ...
- java链表模型_Java数据结构和算法(七)——链表
前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷.在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除效率都很低,并且数组在创建后,其大小是固定了,设置的过大会造 ...
- 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 ...
- leetcode 148. 排序链表(归并排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 示例 1: 输入:head = ...
- 【LeetCode 148】链表的归并排序
上一篇文章用数组实现了二路归并排序,核心在于要对每次减半的元素进行实质性的改变,在数组中我们用临时数组记录每次merge的结果,在链表中用归并排序更加直接,因为我们操作的是结点的指针. 题目描述 难度 ...
最新文章
- Linux运维人员成长之路学习书籍推荐
- HDU2141(二分查找)
- 谈谈微服务设计中的API网关模式
- Swift实现CoreData存储数据
- C++ 使用消息派遣类解决处理消息判断
- k8s sealos应用安装及应用包制作教程
- python opencv图片放大 缩小_Python OpenCV之图片缩放的实现(cv2.resize)
- Javascript如何判断对象是否相等
- 缓存一致性协议MESI
- linux 第一个内核模块Hello World
- C#进阶之WebAPI(一)
- mysql做千万条压测数据
- NOIP2018游记题解
- ~~求欧拉函数(附模板题)
- Megcup2017 Dogfood
- 尴尬的风险管理如何深入下去-某公司为例
- 学习git reset 、 git checkout、git revert
- 消息生产与消息存储——kafka源码探究之三
- 爬虫 推送到discord_如何将自定义表情符号添加到Discord服务器
- 吉他效果器amplitube 4 mac 完整破解版永久激活方法
热门文章
- 学python后到底能干什么-学会Python后都能做什么?网友们的回答简直不要太厉害...
- 学python能做什么-学了Python都能干什么,哪个最赚钱?
- php和python-现在自学php和python那个合适?
- python基础知识-Python学习--最完整的基础知识大全
- qq语音识别_qq语音红包自动识别_qq语音红包一直未识别 - 云+社区 - 腾讯云
- 讯飞语音输入法免费版
- -bash: unzip: 未找到命令_29 条运维工程师必会实用 Linux 命令
- python数据包发送给云平台_用python发送短消息(基于阿里云平台)
- 解决从登录页通过this.$router.push跳转首页后 点返回健路由变而页面不变的问题
- 堆排序matlab,matlab 堆排序 ...原创(初来报到)