当前位置: 首页 > news >正文

力扣148:排序链表

力扣148:排序链表

  • 题目
  • 思路
  • 代码

题目

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

思路

当我们第一眼看见这道题时心中其实是有思路的,我们不想这是个链表就当它是一个整型数组。那么自然而然就会想到各种各样的排序方法,第一眼看上去大部分想到的可能是把这个一分为变成两个子数组再对子数组进行排序。这个想法同样适用于链表只不过只分一次并不行我们需要将其分到彻底分不了也就是只剩一个节点或者干脆没有节点可分。在分完后就好做了啊两个节点还不好做升序排序吗?再往上就算变成了一个链表也是个有序链表,两个有序链表连接起来不也很好做吗。所以这道题的主要就是我们需要想到先将其分开再组合也就是使用分治的思想。
同时这一样也是一种排序方法也就是归并排序只不过归并排序不止可以通过分治来完成还可以使用迭代所以这道题同样也有另外一个方法我就不再说了。无论是分治还是迭代最后完成的都是归并排序,我们使用分治也就是自顶向下进行归并排序。

代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* sortList(ListNode* head) {// 归并排序// 运用分治的思想// 将链表进行划分直到为单个节点// 然后一个一个的连接起来return MergeSort(head, nullptr);}ListNode* MergeSort(ListNode* head, ListNode* tail) {// 直到只剩一个节点或者没有节点if (head == nullptr) {return head;}if (head->next == tail) {head->next = nullptr;return head;}// 寻找中点进行划分ListNode* cur = head;ListNode* prev = head;while (cur != tail && cur->next != tail) {cur = cur->next->next;prev = prev->next;}ListNode* mid = prev;return merge(MergeSort(head, mid), MergeSort(mid, tail));}ListNode* merge(ListNode* list1, ListNode* list2) {// 治也就是连接两个链表// 哨兵节点,方便返回ListNode* newnode = new ListNode(0);ListNode* node = newnode;ListNode* node1 = list1;ListNode* node2 = list2;// 连接节点直到两个链表有一个为空while (node1 != nullptr && node2 != nullptr) {if (node1->val < node2->val) {node->next = node1;node1 = node1->next;} else {node->next = node2;node2 = node2->next;}node = node->next;}// 由于先划分到最底层一个一个节点// 再从一个一个节点组合成链表的// 所以两个链表最多只会多一个节点if (node1 != nullptr) {node->next = node1;node1 = node1->next;node = node->next;}if (node2 != nullptr) {node->next = node2;node2 = node2->next;node = node->next;}return newnode->next;}
};
http://www.lryc.cn/news/611462.html

相关文章:

  • # Kafka 消费堆积:从现象到解决的全链路分析
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-邮箱重置密码
  • python-自定义抠图
  • Python日志记录库——logaid
  • mq_unlink系统调用及示例
  • RC和RR的区别
  • 一文搞定JavaServerPages基础,从0开始写一个登录与人数统计页面
  • Python 函数详解
  • SpringCloud学习------Hystrix详解
  • 通俗版23种设计模式解析
  • 苍穹外卖Day10
  • 智慧酒店:科技赋能下的未来住宿新体验
  • Datawhale AI夏令营 第三期 task2 稍微改进
  • 山东省天地图API申请并加载到QGIS和ArcGIS Pro中
  • 数据结构 实现单链表
  • LeetCode347.前K个高频元素(hash表+桶排序)
  • Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)
  • 思途Mybatis学习 0805
  • LeetCode 刷题【31. 下一个排列】
  • 《Python基础》第3期:使用PyCharm编写Hello World
  • C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化
  • 【C语言】动态内存管理详解
  • Kafka 的基本操作(1)
  • 国内办公安全平台新标杆:iOA一体化办公安全解决方案
  • 【基础】第八篇 Java 位运算符详解:从基础到实战应用
  • 【java】大数据insert的几种技术方案和优缺点
  • 一种基于机器学习的关键安全软件WCET分析方法概述与实际工作原理举例
  • 多传感器融合
  • 机器人权利:真实还是虚幻,机器人权利研究如何可能,道德权利与法律权利
  • nodejs 编程基础01-NPM包管理