力扣HOT100之链表: 148. 排序链表


这道题直接用蠢办法来做的,直接先遍历一遍链表,用一个哈希表统计每个值出现的次数,由于std::map<int, int>会根据键进行升序排序,因此我们将节点的值作为键,其在整个链表中的出现次数作为值,当所有元素统计完毕以后,我们直接按照顺序遍历哈希表,然后将一个键对应的值填入到链表中,当哈希表中所有键都填充完毕时,链表就排序好了,直接返回即可。

/*** 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) {map<int, int> hash;  //记录各个值的ListNode* current = head;while(current){hash[current -> val]++;current = current -> next;}current = head;for(auto i : hash){while(i.second > 0){current -> val = i.first;current = current -> next;i.second--;}}return head;}
};

在手撕面试的时候这样做肯定是不行的,我又去看了下灵神的题解,他的思路也比较简单易懂,但是需要两道题的前置基础,分别是876. 链表的中间结点和21. 合并两个有序链表,这里就不细讲两道题的解题思路了,我们直接将两道题的函数(middleNode()和mergeTwoLists())搬过来用就行了,假设我们现在已经有了这两个功能的函数,然后我们直接进行递归处理,将一个链表进行排序可以分为如下步骤:

  1. 调用middleNode()获取该链表的中间节点,并将中间节点与上一节点的连接切断,从而分成两条长度相近的链表;
  2. 将两条链表的进行排序,也就是递归调用本题的sortList()函数,然后函数分别返回两条排序过后链表的头节点;
  3. 然后调用mergeTwoLists()将两个有序链表合并,最终拼接回一条完整的链表
  4. 返回链表的头节点
    在这里有几个细节需要说明:1.将中间节点与上一节点的连接断开的操作应当在middleNode()函数内进行,在主函数中是无法追溯到中间节点的上一节点的;2.本题函数需要明确递归终止条件,我们很容易想到:当长度为n(n > 2)的链表被递归拆分出长度为2的子链表时,将其拆分为两条长度为1的链表,此时已经不可拆分,也无需排序,所以当链表只含头节点这一个节点时,直接返回头节点即可。**还有一种极端情况:**当输入的原始链表为空时,也不需要进行排序,直接返回头节点即可。
    下面是我的代码
/*** 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://876. 链表的中间结点(代码不完全与那题一样,本题还须做断开链表处理)ListNode* middleNode(ListNode* head) {ListNode* fast = new ListNode();ListNode* slow = new ListNode();fast = head;slow = head;ListNode* pre;while(fast && fast -> next){pre = slow;slow = slow -> next;fast = fast -> next -> next;}pre -> next = nullptr;return slow;}//21. 合并两个有序链表ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {//处理终止条件if(!list1) return list2;if(!list2) return list1;//递归主体逻辑if(list1 -> val < list2 -> val){list1 -> next = mergeTwoLists(list1 -> next, list2);return list1;}else{list2 -> next = mergeTwoLists(list2 -> next, list1);return list2;}}ListNode* sortList(ListNode* head) {//终止条件//链表为空或链表仅有一个节点则无需排序,直接返回if(!head || !head -> next)return head;//递归主体逻辑//1.将链表拆成两条ListNode* left = head;ListNode* right = middleNode(head);//2.将两条链表进行排序left = sortList(left);right = sortList(right);//3.将两条有序链表合并head = mergeTwoLists(left, right);return head;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformer多卡训练初始化分布式环境:(backend=‘nccl‘)

Transformer多卡训练初始化分布式环境:(backend=‘nccl’) dist.init_process_group(backend=nccl)在多卡环境下初始化分布式训练环境,并为每个进程分配对应的 GPU 设备。下面为你逐行解释代码的含义: 1. 初始化分布式进程组 try:dist.init_process_group(backend=nccl) e…

使用Mybatis时在XML中SQL高亮显示的方法

如图所示&#xff0c;上方的SQL代码很像是一个字符串&#xff0c;那么如何把上方的SQL改成和下方一样的SQL,使得IDEA可以识别SQL方言呢&#xff1f; 1.选中SQL中的一部分代码&#xff0c;此时左侧会出现一个黄色的灯泡图案&#xff0c;点击2.选择这个注入语言或者引用

Spring Boot MongoDB自定义连接池配置

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;http://zhangxiaofan.blog.csdn.net/article/details/144341407 一、引言 在 Spring Boot 应用中使用 MongoDB 时&#xff0c;合理配置连接池可以显著提升数据库访问的性能和稳定性。默…

Tabnet介绍(Decision Manifolds)和PyTorch TabNet之TabNetRegressor

Tabnet介绍&#xff08;Decision Manifolds&#xff09;和PyTorch TabNet之TabNetRegressor Decision ManifoldsTabNet1.核心思想2. 架构组成3. 工作流程4. 优点 PyTorch TabNetTabNetRegressor参数1. 模型相关参数n_dn_an_stepsgammacat_idxscat_dimscat_emb_dim 2. 训练相关参…

图像变换方式区别对比(Opencv)

1. 变换示例 import cv2 import matplotlib.pyplot as plotimg cv2.imread(url) img_cut img[100:200, 200:300] img_rsize cv2.resize(img, (50, 50)) (hight,width) img.shape[:2] rotate_matrix cv2.getRotationMatrix2D((hight//2, width//2), 50, 1) img_wa cv2.wa…

Navicat分组、查询分享

1、分组 有些项目业务表比较多&#xff0c;多达几百张&#xff0c;如果通过人眼看&#xff0c;很容易头晕。这时候可以通过Navicat表分组来进行分类。 使用场景 按版本分组按业务功能分组 创建分组 示例&#xff1a;按版本分组&#xff0c;可以将1.0版本的表放到1.0中。 分组…

大模型在初治CLL成人患者诊疗全流程风险预测与方案制定中的应用研究

目录 一、绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与慢性淋巴细胞白血病相关知识 2.1 大模型技术原理与特点 2.2 慢性淋巴细胞白血病的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模…

for循环的优化方式、循环的种类、使用及平替方案。

本篇文章主要围绕for循环,来讲解循环处理数据中常见的六种方式及其特点,性能。通过本篇文章你可以快速了解循环的概念,以及循环在实际使用过程中的调优方案。 作者:任聪聪 日期:2025年4月11日 一、循环的种类 1.1 默认有以下类型 原始 for 循环 for(i = 0;i<10;i++){…

穿透三层内网VPC1

网络拓扑: 打开入口web服务 信息收集发现漏洞CVE-2024-4577 PHP CGI Windows平台远程代码执行漏洞&#xff08;CVE-2024-4577&#xff09;复现_cve-2024-4577漏洞复现-CSDN博客 利用POC&#xff1a; 执行成功&#xff0c;那么直接上传马子&#xff0c;注意&#xff0c;这里要…

【计算机网络】同步操作 vs 异步操作:核心区别与实战场景解析

&#x1f4cc; 引言 在网络通信和分布式系统中&#xff0c;**同步&#xff08;Synchronous&#xff09;和异步&#xff08;Asynchronous&#xff09;**是两种基础却易混淆的操作模式。本文将通过代码示例、生活类比和对比表格&#xff0c;帮你彻底理解它们的区别与应用场景。 1…

TensorFlow充分并行化使用CPU

关键字&#xff1a;TensorFlow 并行化、TensorFlow CPU多线程 场景&#xff1a;在没有GPU或者GPU性能一般、环境不可用的机器上&#xff0c;对于多核CPU&#xff0c;有时TensorFlow或上层的Keras默认并没有完全利用机器的计算能力&#xff08;CPU占用没有接近100%&#xff09;…

Kubernetes容器编排与云原生实践

第一部分&#xff1a;Kubernetes基础架构与核心原理 第1章 容器技术的演进与Kubernetes的诞生 1.1 虚拟化技术的三次革命 物理机时代&#xff1a;资源浪费严重&#xff0c;利用率不足15% 虚拟机突破&#xff1a;VMware与Hyper-V实现硬件虚拟化&#xff0c;利用率提升至50% …

Windows 录音格式为什么是 M4A?M4A 怎样转为 MP3 格式

M4A 格式凭借其高效的压缩技术和卓越的音质表现脱颖而出&#xff0c;成为了包括 Windows 在内的众多操作系统默认的录音格式选择。然而&#xff0c;尽管 M4A 格式拥有诸多优点&#xff0c;不同的应用场景有时需要将这些文件转换为其他格式以满足特定需求。 本文将探讨 M4A 格式…

Qt之OpenGL使用Qt封装好的着色器和编译器

代码 #include "sunopengl.h"sunOpengl::sunOpengl(QWidget *parent) {}unsigned int VBO,VAO; float vertices[]{0.5f,0.5f,0.0f,0.5f,-0.5f,0.0f,-0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f };unsigned int indices[]{0,1,3,1,2,3, }; unsigned int EBO; sunOpengl::~sunO…

HCIP-17 BGP基础2

HCIP-17 BGP基础2 一、bgp的路由黑洞问题 1.bgp的同步功能 ipv4-family unicast IPV4的地址簇 undo synchronization 关闭BGP同步功能 bgp的同步功能原理 当边界路由器从ibgp邻居收到一条路由后&#xff0c;会使用该路由和igp路由表进行比较。 如果在igp路由表中存在…

leetcode_15. 三数之和_java

15. 三数之和https://leetcode.cn/problems/3sum/ 1、题目 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。…

Open Interpreter:重新定义人机交互的开源革命

引言 在人工智能技术蓬勃发展的今天&#xff0c;人机交互的方式正经历着前所未有的变革。Open Interpreter&#xff0c;作为一个开源项目&#xff0c;正在重新定义我们与计算机的互动方式。它允许大型语言模型&#xff08;LLMs&#xff09;在本地运行代码&#xff0c;通过自然…

【JavaScript】错误处理与调试

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. JavaScript 错误处理基础1.1 错误类型1.2 try...catch 语句 2. 错误抛出与自定义错误2.1 throw 语句2.2 自定义错误类型 3. 异步错误处理3.1 Promise 错误处理3.2 async/await 错误处理 4. 调试…

算法基础模板

高精度加法 #include <bits/stdc.h> using namespace std; const int N10005; int A[N],B[N],C[N],al,bl,cl; void add(int A[],int B[],int C[]) {for(int icl-1;~i;i--){C[cl]A[i]B[i];C[cl1]C[cl]/10;C[cl]%10;}if(C[cl])cl; } int main() {string a,b;cin>>a&…

自行搭建一个Git仓库托管平台

1.安装Git sudo apt install git 2.Git本地仓库创建&#xff08;自己选择一个文件夹&#xff09; git init 这里我在 /home/test 下面初始化了代码仓库 1. 首先在仓库中新建一个txt文件&#xff0c;并输入一些内容 2. 将文件添加到仓库 git add test.txt 执行之后没有任何输…