【C++】148 排序链表

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

对链表进行升序排序,常见的做法是使用归并排序(Merge Sort)算法。这种算法适用于链表的排序,并且具有稳定性和时间复杂度为 O(n log n) 的优点。

以下是使用 C 语言实现的归并排序算法来对链表进行排序的示例代码:

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构
struct ListNode {int val;struct ListNode *next;
};// 合并两个有序链表
struct ListNode* merge(struct ListNode* l1, struct ListNode* l2) {if (l1 == NULL) return l2;if (l2 == NULL) return l1;struct ListNode dummy;struct ListNode* tail = &dummy;while (l1 && l2) {if (l1->val < l2->val) {tail->next = l1;l1 = l1->next;} else {tail->next = l2;l2 = l2->next;}tail = tail->next;}tail->next = (l1 != NULL) ? l1 : l2;return dummy.next;
}// 归并排序
struct ListNode* sortList(struct ListNode* head) {if (head == NULL || head->next == NULL) {return head;}// 快慢指针找到中点struct ListNode *slow = head, *fast = head->next;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}struct ListNode* mid = slow->next;slow->next = NULL;// 递归排序左右两部分struct ListNode* left = sortList(head);struct ListNode* right = sortList(mid);// 合并排序后的左右两部分return merge(left, right);
}// 创建新节点
struct ListNode* createNode(int val) {struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));newNode->val = val;newNode->next = NULL;return newNode;
}// 打印链表
void printList(struct ListNode* head) {struct ListNode* curr = head;while (curr) {printf("%d -> ", curr->val);curr = curr->next;}printf("NULL\n");
}// 释放链表内存
void freeList(struct ListNode* head) {struct ListNode* curr = head;while (curr) {struct ListNode* temp = curr;curr = curr->next;free(temp);}
}int main() {// 创建示例链表:4 -> 2 -> 1 -> 3struct ListNode* head = createNode(4);head->next = createNode(2);head->next->next = createNode(1);head->next->next->next = createNode(3);printf("Original list: ");printList(head);// 对链表进行排序head = sortList(head);printf("Sorted list: ");printList(head);// 释放链表内存freeList(head);return 0;
}

使用两个辅助函数 merge 和 sortList。merge 函数用于合并两个有序链表,sortList 函数用于对链表进行归并排序

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

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

相关文章

LeetCode 题目 119:杨辉三角 II

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

Redis——Redis的数据库结构、删除策略及淘汰策略

Redis是一个高性能的key-value存储系统&#xff0c;它支持多种数据结构&#xff0c;并提供了丰富的删除策略和淘汰策略。以下是关于Redis的数据库结构、删除策略及淘汰策略的详细介绍&#xff1a; Redis的数据库结构 Redis是一个key-value数据库&#xff0c;数据存储是以一个…

day06-07面向对象(高级)

面向对象(高级) 知识回顾: 1.面向对象基础 类的定义 对象的使用 private关键字 this关键字 封装 构造方法 JavaBean2.API 的使用 知识回顾 Scanner Random String Date1.继承 查看下述代码: 发现有什么问题&#xff1f; 你所抽取的代码没有了&#xff0c;怎么办&#xff1f…

【Qt-CMake】QT中cmak编译出现CMake Error: The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的&#xff0c;编写代码时发现无论怎样修改代码&#xff0c;运行后都没有任何变化&#xff0c;以为是qtbug&#xff0c;重构重启都没用&#xff0c;最后…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件&#xff1a; 例如&#xff1a;将home.ui文件转为vio_detect.py文件&#xff0c;所需命令如下&#xff1a; pyuic5 -x home.ui -o vio_detect.py

XXE-lab靶场搭建

源码下载地址 https://github.com/c0ny1/xxe-lab1.php_xxe 直接放在php web页面下即可运行。 2.java_xxe java_xxe是serlvet项目&#xff0c;直接导入eclipse当中即可部署运行。 3.python_xxe: 安装好Flask模块python xxe.py 4.Csharp_xxe 直接导入VS中运行 phpstudy…

内存操作数及寻址方式

debug命令 debug命令&#xff0c;即DOS实用程序。DEBUG是一个DOS实用程序&#xff0c;是供程序员使用的程序调试工具&#xff0c;可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于逐指令执行某个程序以验证程序运行的正确性&#xff0c;也可以追踪执行过程…

编程代码的舞者--Python循环语句

循环语句是编程中不可或缺的要素之一&#xff0c;它们能够让程序反复执行特定的任务&#xff0c;提高代码的重复利用性和效率。在本篇博客中&#xff0c;我们将深入探讨Python中常用的循环语句&#xff0c;包括for循环和while循环&#xff0c;以及控制循环流程的关键字break和c…

转载:ubuntu18.04 安装wine以及添加mono和gecko打开简单.net应用的方法

https://www.cnblogs.com/jinanxiaolaohu/p/12191576.html 1. 今天突然想试试能不能用ubuntu跑一下公司的.net的智能客户端(SmartClient). 想到的办法就是 安装wine 但是过程略坑..这里简单说一下总结之后的过程. 2. 第一步安装wine相关内容 查了下有winehq和wine两种. …

C语言如何证明联合体变量的所有成员是共享⼀个内存单元的?

一、问题 联合体⼜名共⽤体&#xff0c;⽤共⽤体这个名字更能体现这个类型的特点&#xff0c;那就是所有成员变量共⽤⼀个内存单元。 联合体变量的这⼀特点决定了联合体变量的使⽤⽅法&#xff0c;即在某⼀时刻只有⼀个成员有意义&#xff0c;其他成员⽆意义。那么&#xff0c;…

算法专题:位运算

目录 常见位运算总结 位运算相关算法题 1. 只出现一次的数字 2. 只出现一次的数字&#xff08;|||&#xff09; 3. 两整数之和 4. 只出现一次的数字&#xff08;||&#xff09; 常见位运算总结 在开始刷位运算这个类型的题目前&#xff0c;我想先带着大家学习一下一些常见…

程序员录制真人出镜类课程

真人出镜类课程片段的制作 接下来&#xff0c;我们来具体讲解真人出镜类课程片段的创建过程。 什么是真人出镜类课程片段 「真人出镜」类型的视频只需通过摄像头、手机或摄像机直接进行录制即可。然而&#xff0c;当涉及到真人出镜的课程时&#xff0c;情况就相对复杂一些。这…

手机在网状态多方面重要性

手机在网状态的重要性体现在多个方面&#xff0c;它是现代社会中人们保持联系、获取信息以及进行日常活动不可或缺的一部分。以下是一些关于手机在网状态重要性的详细解释&#xff1a; 通信联系&#xff1a; 手机是在现代社会中进行通信联系的主要工具。当手机处于在网状态时&…

【Python单点知识】类成员汇总讲解——包含类方法、静态方法、私有成员说明

文章目录 0. 前言1. 属性&#xff08;Attributes&#xff09;1.1 类属性&#xff08;Class Attributes&#xff09;1.2 实例属性&#xff08;Instance Attributes&#xff09; 2. 方法&#xff08;Methods&#xff09;2.1 实例方法&#xff08;Instance Methods&#xff09;2.2…

算法实战:亲自写红黑树之三 算法详解

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 此文承接&#xff1a;算法实战…

动态规划:力扣LCR 188. 买卖芯片的最佳时机

题目 数组 prices 记录了某芯片近期的交易价格&#xff0c;其中 prices[i] 表示的 i 天该芯片的价格。你只能选择 某一天 买入芯片&#xff0c;并选择在 未来的某一个不同的日子 卖出该芯片。请设计一个算法计算并返回你从这笔交易中能获取的最大利润。 如果你不能获取任何利…

【软考高项】四十四、高级项目管理

一、项目集管理 相关角色 项目集发起人、项目集指导委员会、项目集经理、其他影响项目集的干系人项目集管理绩效域 项目集战略一致性、项目集效益管理、项目集干系人参与、项目集治理和项目集生命周期管理 二、项目组合管理 项目组合经理角色 项目组合管理原…

Imitation Learning学习记录(理论例程)

前言 最近还是衔接着之前的学习记录&#xff0c;这次打算开始学习模仿学习的相关原理&#xff0c;参考的开源资料为 TeaPearce/Counter-Strike_Behavioural_Cloning: IEEE CoG & NeurIPS workshop paper ‘Counter-Strike Deathmatch with Large-Scale Behavioural Clonin…

java项目之汽车资讯网站源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汽车资讯网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 汽车资讯网站的主要使用者管…

Vue从入门到实战Day04

一、组件的三大组成部分&#xff08;结构/样式/逻辑&#xff09; 1. scoped样式冲突 默认情况&#xff1a;写在组件中的样式会全局生效 -> 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式&#xff1a;默认组件中的样式会作用到全局 2. 局部样式&#xff1a;可以…