c语言实现两个有序链表的合并

        合并两个有序链表是c语言数据结构中比较经典的问题,首先两个链表都是有序的,即节点的顺序是按照各个节点中的值从小到大排序,而且合并之后的新链表中的各个节点顺序也要满足从小到大的排序,具体如下图所示。

         思路:用malloc申请一个哨兵位的头节点NewHead,作为合并之后新链表的头节点(注意此头节点的作用是作为一个哨兵,最后用完要将其释放)。再定义三个指针,指针1用来遍历链表1中的节点,指针2遍历链表2中的节点,指针3则用来维护合并之后的新链表。将指针1指向的节点与指针2指向的节点进行值的比较,小的一方则把节点“给到”NewHead节点的下一个节点,并且移动指针3往后走,继续维护下一个节点。

        若List1和List2中有一个指针已经遍历到空,则直接将另一条链表剩余节点都连接到tail指向的节点后面,也就是将没有指向空的指针给到了tail维护的节点的next。

        最后合并链表的任务完成后,对newhead哨兵位的头节点进行释放,并且要记住newhead节点的下一个节点的位置,因为该位置才是合并后链表的真正意义上的头节点的地址。

        测试代码实现如下(代码包括创建链表、打印链表、测试合并链表的功能): 

#include<stdio.h>
#include<stdlib.h>

typedef struct ListNode //创建节点结构体
{
	int data;
	struct ListNode* next;
}LNode;

void Print(LNode* phead)//打印函数
{
	LNode* cur = phead;
	while (cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL");//模拟链表最后指向的是NULL
}

LNode* mergeTwoLists(LNode* list1, LNode* list2) {
	LNode* head = NULL;//记住合并后链表的头节点
	LNode* tail = NULL;//用于遍历合并后的链表
	head = tail = (LNode*)malloc(sizeof(LNode));//创建一个头节点newhead
	while (list1 && list2)//若有一个指针为空,则跳出循环
	{
		if (list1->data > list2->data)//数据小的节点给到tail
		{
			tail->next = list2;
			list2 = list2->next;
		}
		else
		{
			tail->next = list1;
			list1 = list1->next;
		}
		tail = tail->next;//更新tail的位置,以便下一次节点的插入
	}
	if (list1)//若list1指针不为空则说明list2指针为空,则直接将list1指向的节点给到tail
	{
		tail->next = list1;
	}
	else//反之,若list2指针不为空则说明list1指针为空,则直接将list2指向的节点给到tail
	{
		tail->next = list2;
	}
	LNode* poi = head;//记住头节点的位置,因为准备释放申请的头节点的空间,
	//因为最终返回是不带哨兵位节点的链表
	head = head->next;//head指向哨兵位节点的下一个节点,该节点才是合并链表后真正的头节点
	free(poi);//释放申请的空间
	return head;//返回合并后链表的头节点的地址
}
int main()
{
	//链表List1
	LNode* n1 = (LNode*)malloc(sizeof(LNode));//创建3个节点
	LNode* n2 = (LNode*)malloc(sizeof(LNode));
	LNode* n3 = (LNode*)malloc(sizeof(LNode));

	LNode* plist1 = n1;//指向List1的头指针plist1
	n1->data = 1;//给每个节点都赋值
	n2->data = 2;
	n3->data = 4;
	
	n1->next = n2;//手动构建链表
	n2->next = n3;
	n3->next = NULL;

	//链表List2
	LNode* n4 = (LNode*)malloc(sizeof(LNode));//创建3个节点
	LNode* n5 = (LNode*)malloc(sizeof(LNode));
	LNode* n6 = (LNode*)malloc(sizeof(LNode));

	LNode* plist2 = n4;//指向List2的头指针plist2
	n4->data = 1;//给每个节点都赋值
	n5->data = 3;
	n6->data = 4;

	n4->next = n5;//手动构建链表
	n5->next = n6;
	n6->next = NULL;

	printf("List1:");
	Print(plist1);//打印链表1

	printf("\nList2:");
	Print(plist2);//打印链表2

	printf("\n合并后:");
	LNode* newhead = mergeTwoLists(plist2, plist1);//合并函数
	Print(newhead);//打印合并后的链表

	return 0;
}

        运行结果:

结语:

        合并链表的方法如上,希望本文可以对你起到帮助!! ( ̄︶ ̄)↗ 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot国际化

1.环境配置 这里插入图片描述](https://img-blog.csdnimg.cn/024d6bc95623485eb6da4d998a892458.png) 2.文件配置 第一个默认环境 第二个英文环境 第三个中文环境 3.变量配置 调整语言 原理&#xff1a; 找到MessageSourceAutoConfiguration 中的 利用代碼的方式獲取国…

GetSimple CMS忘记密码

GetSimple CMS是一个超简单的 CMS&#xff0c;适合建立个人网站等只需要极少数页面的网站。在站上百科上&#xff0c;是这么说的&#xff1a; GetSimple是一款基于XML存储数据的开源内容管理系统&#xff0c;且易于安装和定制&#xff0c;无需MySQL支持。提供撤销保护和备份功能…

阿里云OSS和腾讯云COS对象存储介绍和简单使用

对象存储指的是一种云存储服务&#xff0c;其主要是将数据以对象的形式存储在云端&#xff0c;并且提供了完全的API调用&#xff0c;这些API包括上传&#xff0c;下载&#xff0c;删除&#xff0c;复制&#xff0c;预览&#xff0c;权限设置等等。OSS对象存储和COS对象存储都是…

图像相似度对比方法

1.哈希方法&#xff0c;其中包括均值哈希、插值哈希、感知哈希方法。计算出图片的哈希值&#xff0c;一般使用汉明 距离计算两个图片间的差距。 2.直方图算法&#xff0c;其中包括灰度直方图算法&#xff0c;RGB直方图算法&#xff0c; 3.灰度图算法&#xff1a;MSE、SSIM、…

echarts图从隐藏到显示以后大小有问题的解决方法

大家好&#xff0c;我是南宫。 今天分享一个刚刚解决的问题。 稍微介绍一下问题的背景&#xff1a; 我有一个绘制柱状图的需求&#xff0c;之前已经画好了&#xff0c;没想到今天对接数据的时候发现&#xff0c;如果没有数据&#xff0c;后端是直接返回一个空数组的。&#…

Linux系统编程——实现cp指令(应用)

cp指令格式 cp [原文件] [目标文件] cp 1.c 2.c 功能是将原文件1.c复制后并改名成2.c(内容相同&#xff0c;实现拷贝) 这里需要引入main函数的参数解读&#xff1a; 我们在定义函数时许多都带有参数&#xff0c;输入参数后便可进行定义函数内的功能执行&#xff0c;而main…

终止进程后,GPU显存仍被占用问题 | kill -9彻底杀死进程 | ps aux|grep python

本文部分内容参考博客&#xff0c;十分感谢&#xff01;&#xff01;&#xff01; 问题描述&#xff1a;在Linux终端把进程终止后&#xff0c;发现显存没有被释放出来&#xff01; ---------------------------------------------------------------------------------------F…

【java:牛客每日三十题总结-5】

java:牛客每日三十题总结 总结如下 总结如下 -Xmx&#xff1a;最大堆大小 -Xms&#xff1a;初始堆大小 -Xmn:年轻代大小 -XXSurvivorRatio&#xff1a;年轻代中Eden区与Survivor区的大小比值 年轻代5120m&#xff0c; Eden&#xff1a;Survivor3&#xff0c;Survivor区大小102…

No185.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

爬虫项目(12):正则、多线程抓取腾讯动漫,Flask展示数据

文章目录 书籍推荐正则抓取腾讯动漫数据Flask展示数据 书籍推荐 如果你对Python网络爬虫感兴趣&#xff0c;强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧&#xff0c;是每位爬虫开发者的必读之作。详细介绍见&#x1f44…

使用python电脑轻量级控制手机—adb命令和手机投屏

文章目录 一、通过无线连接手机和电脑二、使用adb命令轻量级控制手机二、使用scrcpy控制手机 通过电脑控制手机有多种方式如appnium等&#xff0c;本文介绍的是两种轻量级的方案&#xff0c;使用adb命令刚和手机投屏。 一、通过无线连接手机和电脑 1、手机设置 开发者选项—us…

【文章阅读】Transfer learning for drug–target interaction prediction

Bioinformatics , 2023 Transfer learning for drug–target interaction prediction 本文主要是对迁移学习所使用的三种模式进行学习 &#xff0c;本文没有什么很值得细读的&#xff0c;只是介绍了三种迁移学习的方式罢了 深度迁移学习是将迁移学习应用于深度神经网络。深度迁…

体验版CorelDRAW2023矢量图话题工具

在当今数字化时代&#xff0c;图形设计已经成为了各行各业不可或缺的一部分。无论是企业的品牌标识、广告宣传&#xff0c;还是个人的插画作品、名片设计&#xff0c;都需要一个强大而多功能的设计软件来实现。而CorelDRAW正是这样一款令人惊叹的工具&#xff0c;它不仅提供了丰…

腾讯云3年轻量2核2G4M和2核4G5M服务器540元三年

腾讯云轻量应用服务器特价是有新用户限制的&#xff0c;所以阿腾云建议大家选择3年期轻量应用服务器&#xff0c;一劳永逸&#xff0c;免去续费困扰。腾讯云轻量应用服务器3年可以选择2核2G4M和2核4G5M带宽&#xff0c;3年轻量2核2G4M服务器540元&#xff0c;2核4G5M轻量应用服…

Cocos开发

harmonyOS开发 在Cocos Creator中&#xff0c;场景是一个独立的文件资源&#xff0c;可以像打开PSD文件一样在编辑器中双击打开&#xff1b; 场景文件是数据驱动工作流的核心&#xff0c;场景中包括图像资源、动画、特效以及驱动游戏逻辑和表现的脚本&#xff1b; Cocos Crea…

王道数据结构课后代码题p40 9.给定一个带表头结点的单链表,写出算法 : 按递增次序输出单链表中各结点的数据元素并释放结点 (c语言代码实现)

本题代码如下&#xff08;有注释&#xff09; void delete_min(linklist* head) {while ((*head)->next ! NULL)//循环到只剩下头节点{lnode* pre *head;//pre为元素最小结点的前驱结点指针lnode* p (*head)->next;//p为工作指针lnode* q;//指向被删除的结点while (p-…

数据结构与算法C语言版学习笔记(3)-线性表的链式结构:链表

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言&#xff1a;回顾顺序表的优缺点&#xff1a;为什么要引入链式结构的线性表&#xff1f; 一、什么是链表&#xff1f;二、链表的分类①为什么要设置头节点&…

若依框架维护问题

1.设置table高度 2.处理弹出框遮罩层 < el-dialog :title“title” custom-class“custom_drawer_class” :visible.sync“visible” size“50%” append-to-body> </ el-dialog>

jmeter+ant实现的接口自动化测试

jmeterANT接口自动化测试框架 项目说明 本框架是一套基于jmeterAntExcelPython而设计的数据驱动接口自动化测试框架&#xff0c;jmeter 作为执行器&#xff0c;Ant 作为构建工具&#xff0c;进行构建测试&#xff0c;本框架无需你使用代码编写用例&#xff0c;测试用例存储在…

【原型详解】JavaScript原型链:深入了解Prototype,超级详细!!!

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript进阶指南 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继…
最新文章