null最后如何排序的_LeetCode 148——排序链表
1. 题目
2. 解答
2.1 快速排序
可参考快速排序和归并排序中的第一种快速排序思想,与在数组中排序有两点不同。
第一,我们需要取最后一个元素作为主元,在数组中可以直接访问到最后一个元素,但在单链表中,我们需要先遍历一遍链表才能访问到最后一个元素。
第二,在数组中,利用主元将数组划分为左右两个部分后,我们可以用下标来递归调用,但在链表中,我们改用头指针和尾指针来标识左右两个部分。如下图所示,左半部分头指针为 head,尾指针为 p1;右半部分头指针为 p1-next,尾指针为 end。
class Solution {public:ListNode* sortList(ListNode* head) {if(head == NULL) return head;Quick_Sort(head, NULL);return head; }void Quick_Sort(ListNode* head, ListNode* end){if (head != end && head->next != end){ListNode* ptr = head;while(ptr->next != end) ptr = ptr->next; // 取链表最后一个元素作为主元int pivot = ptr->val;ListNode* p1 = head;ListNode* p2 = head;while(p2->next != end){if(p2->val < pivot){int temp = p2->val;p2->val = p1->val;p1->val = temp;p1 = p1->next;}p2 = p2->next;}p2->val = p1->val;p1->val = pivot;Quick_Sort(head, p1); // 此时 p1 指向 pivot,前一半链表头为 head,尾为 p1Quick_Sort(p1->next, end); // 后一半链表头为 p1->next,尾为 end}}
2.2 归并排序
可参考快速排序和归并排序中的归并排序思想,主要有三个步骤。
- 找到链表的中间结点
- 递归对左半部分和右半部分排序
- 合并排序好的两部分链表,这部分因为不能使用额外空间,我们就将一个链表插入到另一个链表中去
class Solution {public:ListNode* sortList(ListNode* head) {return Merge_Sort(head);}ListNode* Merge_Sort(ListNode* head){ListNode * mid = Find_Mid(head);if (mid){ListNode* right_head = mid->next;mid->next = NULL;ListNode* left_head = Merge_Sort(head);right_head = Merge_Sort(right_head);head = Merge_List(left_head, right_head);}return head;}ListNode* Merge_List(ListNode* left_head, ListNode* right_head){ListNode* l1 = left_head;ListNode* l2 = right_head;if (left_head->val > right_head->val){l1 = right_head;l2 = left_head;}// l1 指向第一个节点值较小的链表,然后将 l2 中的每个节点插入到 l1 中ListNode* p1 = NULL;ListNode* head = l1;while (l1->next && l2){if (l1->next->val > l2->val){p1 = l1->next;l1->next = l2;l2 = l2->next;l1 = l1->next;l1->next = p1;}else{l1 = l1->next;}}if (l2) l1->next = l2; //若 l2 还有节点直接插入到 l1 后面即可return head;}ListNode* Find_Mid(ListNode* head){if (head == NULL || head->next == NULL) return NULL;ListNode* slow = head;ListNode* fast = head;while (fast->next != NULL && fast->next->next != NULL){slow = slow->next;fast = fast->next->next;}return slow;}};
null最后如何排序的_LeetCode 148——排序链表相关推荐
- 【LeetCode】【HOT】148. 排序链表(归并排序)
[LeetCode][HOT]148. 排序链表 文章目录 [LeetCode][HOT]148. 排序链表 package hot;import java.util.Arrays;class Lis ...
- 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表
前言: 对于链表来说,排序首选应该是归并算法 维基百科上有归并算法的迭代版本和递归版本 基于数组实现的. https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B ...
- LeetCode Algorithm 148. 排序链表
148. 排序链表 Ideas 链表结构的经典题目. 不过我不想用经典方法做,哎,就是皮. 我把链表元素都拷贝到数组中,然后对数组排序,之后再把排完序之后的值赋回去. 骚的一批. Code Pytho ...
- leetcode 148. Sort List | 148. 排序链表(最优解归并排序,O(1)空间)
题目 https://leetcode.com/problems/sort-list/ 题解 分析 就链表排序问题来说,它的解法可以有好多种.但它的最优解应该只有一种思路,即从下至上的归并,时间复杂度 ...
- leetcode 148. 排序链表(归并排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 示例 1: 输入:head = ...
- 83. Leetcode 148. 排序链表 (排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 .示例 1:输入:head = [4,2,1,3] 输出:[1,2,3,4] 示例 2:输入:head = [-1,5,3,4, ...
- java 桶排序_[图解] 桶排序
桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...
- 链表节点合并排序:数组和单链表
每日一贴,今天的内容关键字为链表节点 1 数组合并排序 1.1 合并两个已排序好的数组 需要额定的存储空间用来存储合并结果 //merge two array which are already so ...
- 排序---初级排序算法(选择排序、插入排序和希尔排序)
写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera Algorithms Part1&2 本文 ...
最新文章
- 零基础ui设计培训一定要知道字体设计规则
- 浅谈Struts2和Sturts1的区别
- C++【typedef 关键字 详解】
- C语言合并链表merge linked list(附完整源码)
- ext中fieldLabel文本太宽的问题,以及Panel居中显示
- lambda表达式初步
- [学习方法]如何解析源代码
- Android集成三方浏览器之Crosswalk
- 断电后supervisor启动时报错
- jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】
- 【机器学习】监督学习--(回归)多项式回归
- 特别看好高校团队的联想创投,在中科大拉开高校AI精英挑战赛大幕
- Echarts数据可视化全解
- 树形DP+二分(Information Disturbing HDU3586)
- test luasql's postgresql driver performance (not better than pgbench)
- mac虚拟机哪个好用 mac双系统和虚拟机哪个好
- android so劫持,防劫持SDK
- 职场动物进化手册-读后感
- qt 获取QString 中的数字
- Unity2D入门(八):游戏场景中的UI(主菜单与暂停菜单)
热门文章
- 【DP】UVA 103 Stacking Boxes 输出路径
- JS 前端排序 数组指定项移动到最后
- Tips--利用shell脚本批量提取txt文件中任意字段
- 7-35 情人节 (15 分)
- java方法嵌套数据源切换_SpringBoot AOP方式实现多数据源切换的方法
- selenium java项目_1)selenium+ java集成,待深度项目流程应用
- 时间复杂度O(n^2)和O(nlog n)差距有多大?
- Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
- 实例分解神经网络反向传播算法(转)
- ※归并排序(merge sort)