【LeetCode热题100】【链表】排序链表

devtools/2024/9/24 7:19:44/

题目链接:148. 排序链表 - 力扣(LeetCode)

要排序一个链表,最快的方法是用一个数组将链表节点的值存起来然后排序数组后重新构建链表

但是从面试的角度,我们应该在链表原地排序,这里使用最简单的归并排序

归并排序分三步:拆成两个部分、继续归并排序两个部分、合并两个部分

拆成两个部分,要保持logn的递归树深度,每次拆分需要拆成两半差不多大小的,也就是寻找链表的中间节点,然后以中间节点为界限分成两个链表,即寻找链表的中间节点:使用快慢指针,当快指针到达链表末尾,慢指针即到达链表中间

    ListNode *findMidst(ListNode *head) {ListNode *slow = head, *fast = head;while (fast->next && fast->next->next) {slow = slow->next;fast = fast->next->next;}return slow;}

然后是考察合并两个有序链表:如果其中一个链表为空,则返回另一个链表,比较两个链表首节点的大小,让小的节点成为新链表的头节点,递归合并后面的

    ListNode *merge(ListNode *l1, ListNode *l2) {if (l1 == nullptr)return l2;if (l2 == nullptr)return l1;if (l1->val < l2->val) {l1->next = merge(l1->next, l2);return l1;}l2->next = merge(l1, l2->next);return l2;}

 最后是归并排序链表,先找出链表的中间位置拆分成两个链表,递归归并排序两个链表后合并

    ListNode *sortList(ListNode *left) {if (left == nullptr || left->next == nullptr)return left;ListNode *midst = findMidst(left);ListNode *right = midst->next;midst->next = nullptr;return merge(sortList(left), sortList(right));}

完整代码 

class Solution {
public:ListNode *merge(ListNode *l1, ListNode *l2) {if (l1 == nullptr)return l2;if (l2 == nullptr)return l1;if (l1->val < l2->val) {l1->next = merge(l1->next, l2);return l1;}l2->next = merge(l1, l2->next);return l2;}ListNode *findMidst(ListNode *head) {ListNode *slow = head, *fast = head;while (fast->next && fast->next->next) {slow = slow->next;fast = fast->next->next;}return slow;}ListNode *sortList(ListNode *left) {if (left == nullptr || left->next == nullptr)return left;ListNode *midst = findMidst(left);ListNode *right = midst->next;midst->next = nullptr;return merge(sortList(left), sortList(right));}
};


http://www.ppmy.cn/devtools/11767.html

相关文章

解决方案 SHUTDOWN_STATE xmlrpclib.py line: 794 ERROR: supervisor shutting down

Supervisor操作命令 重新加载 Supervisor 配置&#xff1a; sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart all这将重新读取 Supervisor 的配置文件&#xff0c;更新进程组&#xff0c;然后重启所有进程。 查看 Supervisor 日志&#xff1…

[ LeetCode ] 题刷刷(Python)-第28题:找出字符串中第一个匹配项的下标

题目描述 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 示例 1&#xff1a; 输入&#xff1a;…

数据的质量控制软件----fastQC

一、前言 FastQC的基本介绍: FastQC是一款基于Java的软件&#xff0c;它可以快速地对测序数据进行质量评估&#xff0c;其官网为&#xff1a;Babraham Bioinformatics - FastQC A Quality Control tool for High Throughput Sequence Data 高通量测序数据的高级质控工具输入…

学习笔记-数据结构-线性表(2024-04-16)

设计一个算法判断单链表中元素是否是递增的。 设计思想&#xff1a;双指针操作 变量说明&#xff1a; head表示链表头指针 p和q表示两个用来遍历链表的指针节点&#xff0c;且q始终在p之后 bool IsIncrease(LinkList *head) {// 代码优先判空&#xff0c;若为空链表&#xff…

BBS前后端混合项目--02

展示 template-404.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></scr…

GPT提示词分享 —— 小说家

提示词&#x1f447; 我希望你能作为一个小说家。你要想出有创意的、吸引人的故事&#xff0c;能够长时间吸引读者。你可以选择任何体裁&#xff0c;如幻想、浪漫、历史小说等--但目的是要写出有出色的情节线、引人入胜的人物和意想不到的高潮。我的第一个要求是 小说类型 GPT…

快速排序题目SelectK问题(力扣75.颜色分类、力扣215.数组中的第K个最大元素、面试题17.14最小K个数)

力扣75.颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sor…

docker in docker原理与实战

Docker in Docker&#xff08;简称为DinD&#xff09;是一种将Docker容器作为另一个Docker容器的运行环境的技术。这种技术允许在Docker容器内部运行另一个Docker守护进程&#xff0c;使得在容器中可以创建和管理其他容器。下面是DinD的原理和实战&#xff1a; 原理&#xff1…