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

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

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

  2. 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表

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

  3. LeetCode Algorithm 148. 排序链表

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

  4. leetcode 148. Sort List | 148. 排序链表(最优解归并排序,O(1)空间)

    题目 https://leetcode.com/problems/sort-list/ 题解 分析 就链表排序问题来说,它的解法可以有好多种.但它的最优解应该只有一种思路,即从下至上的归并,时间复杂度 ...

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

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

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

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

  7. java 桶排序_[图解] 桶排序

    桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...

  8. 链表节点合并排序:数组和单链表

    每日一贴,今天的内容关键字为链表节点 1 数组合并排序 1.1 合并两个已排序好的数组 需要额定的存储空间用来存储合并结果 //merge two array which are already so ...

  9. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

最新文章

  1. 零基础ui设计培训一定要知道字体设计规则
  2. 浅谈Struts2和Sturts1的区别
  3. C++【typedef 关键字 详解】
  4. C语言合并链表merge linked list(附完整源码)
  5. ext中fieldLabel文本太宽的问题,以及Panel居中显示
  6. lambda表达式初步
  7. [学习方法]如何解析源代码
  8. Android集成三方浏览器之Crosswalk
  9. 断电后supervisor启动时报错
  10. jzoj6067-[NOI2019模拟2019.3.18]More?More!【dp】
  11. 【机器学习】监督学习--(回归)多项式回归
  12. 特别看好高校团队的联想创投,在中科大拉开高校AI精英挑战赛大幕
  13. Echarts数据可视化全解
  14. 树形DP+二分(Information Disturbing HDU3586)
  15. test luasql's postgresql driver performance (not better than pgbench)
  16. mac虚拟机哪个好用 mac双系统和虚拟机哪个好
  17. android so劫持,防劫持SDK
  18. 职场动物进化手册-读后感
  19. qt 获取QString 中的数字
  20. Unity2D入门(八):游戏场景中的UI(主菜单与暂停菜单)

热门文章

  1. 【DP】UVA 103 Stacking Boxes 输出路径
  2. JS 前端排序 数组指定项移动到最后
  3. Tips--利用shell脚本批量提取txt文件中任意字段
  4. 7-35 情人节 (15 分)
  5. java方法嵌套数据源切换_SpringBoot AOP方式实现多数据源切换的方法
  6. selenium java项目_1)selenium+ java集成,待深度项目流程应用
  7. 时间复杂度O(n^2)和O(nlog n)差距有多大?
  8. Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
  9. 实例分解神经网络反向传播算法(转)
  10. ※归并排序(merge sort)