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

news2024/9/21 14:54:30

        合并两个有序链表是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.coloradmin.cn/o/1202651.html

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

相关文章

2012年7月11日 Go生态洞察:Gccgo在GCC 4.7.1中的集成

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Mysql学习笔记--基础

一&#xff0c;SQL最重要的增删改命令格式 1&#xff0c;insert into 表名&#xff08;不写这个括号里面的内容就默认所有字段都要添加&#xff09; values&#xff08;&#xff09; 插入单条数据 2&#xff0c;insert into 表名 (里面是列名) values&#xff08;根据列名依次…

.Net-C#文件上传的常用几种方式

1.第一种上传方式,基本通用于.net所有的框架 [HttpPost][Route("Common/uploadFile1")]public string uploads(){HttpContextBase context (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBase request context.Re…

阶段七-Day04-Spring03

一、Sping声明式事务 1. 编程式事务介绍 整个事务控制的代码都需要程序员自己编写。包含&#xff1a;开启事务&#xff08;openSession()&#xff0c;创建SqlSession时MyBatis底层自动创建Transaction对象&#xff09;、提交事务(session.commit())、回滚事务(session.rollba…

新型的铁塔基站“能源管家”

安科瑞 崔丽洁 引言&#xff1a;随着5G基站的迅猛发展&#xff0c;基站的能耗问题也越来越突出&#xff0c;高效可靠的基站配电系统方案&#xff0c;是提高基站能耗使用效率&#xff0c;实现基站节能降耗的重要保证&#xff0c;通过多回路仪表监测每个配电回路的用电负载情况&a…

Clickhouse学习笔记(9)—— 语法优化

ClickHouse 的 SQL 优化规则是基于 RBO(Rule Based Optimization&#xff09;实现的 官方数据集的使用 为了方便测试CK的语法优化规则&#xff0c;尝试使用官方提供的数据集&#xff1b; 需要使用的数据集是visits_v1和hints_v1&#xff1a; Anonymized Web Analytics Data …

Mysql基本知识

1.SQL分类 DDL【data definition language】 数据定义语言&#xff0c;用来维护存储数据的结构 代表指令: create, drop, alter DML【data manipulation language】 数据操纵语言&#xff0c;用来对数据进行操作 代表指令&#xff1a; insert&#xff0c;delete&#xff0c;up…

MapInfo Pro “偏移”命令

偏移对象的用途是什么&#xff1f; 将一个或多个地图对象移动特定距离和/或方向&#xff0c;并将其放置在可编辑层中。对象可以来自任何层。您可以在选择操作后聚合数据。 ​ “偏移对象”何时处于活动状态&#xff1f; 当“贴图”窗口为活动窗口时&#xff0c;该窗口具有可编…

2023数字科技生态大会-数字安全论坛 学习笔记

监管合规->价值创造的方向&#xff0c;在安全领域的发展方向-安全运营服务型 ICT->数字->数据 数字安全&#xff1a;网络安全数据安全 传统信息化以计算为核心&#xff0c;数字化以数据为核心 数字安全技术发展十大趋势&#xff1a; 一、 数字安全技术政策环境将不…

电热毯电热床上用品上架亚马逊美国站UL964测试标准要求

美国是一个对安全要求非常严格的国家&#xff0c;美国本土的所有电子产品生产企业早在很多年前就要求有相关检测。而随着亚马逊在全球商业的战略地位不断提高&#xff0c;境外的电子设备通过亚马逊不断涌入美国市场。“为保证消费者得安全&#xff0c;亚马逊始终强调带电得产品…

一文了解芯片测试项目和检测方法 -纳米软件

芯片检测是芯片设计、生产、制造成过程中的关键环节&#xff0c;检测芯片的质量、性能、功能等&#xff0c;以满足设计要求和市场需求&#xff0c;确保芯片可以长期稳定运行。芯片测试内容众多&#xff0c;检测方法多样&#xff0c;今天纳米软件将为您介绍芯片的检测项目都有哪…

【EDAS论文投稿】

背景 第一次使用这个系统投稿&#xff0c;不是很熟练甚至差点错过了投稿时间&#xff0c;所以记录一下投稿过程中出现的致命问题。 注册、登录就不用说了 登陆后选择自己的会议的symposia 添加文章信息&#xff1b;依次添加作者信息 在第三步长传文件时&#xff0c;系统提示…

Ultipa 支持OpenCypher,助力企业级应用发展

OpenCypher 是欧美图数据库厂家 Neo4j 基于其图查询语言Cypher 开发的一套开源图查询语言&#xff0c;该语言也是开发者们较为熟悉的图查询语言之一。 Ulitpa Graph&#xff08;嬴图&#xff09;于2022年6月实现的对OpenCypher 的支持&#xff0c;旨在让用户能够通过自己熟悉的…

springcloudalibaba入门详细使用教程

目录标题 一、简介二、SpringCloud Alibaba核心组件2-1、Nacos (配置中心与服务注册与发现)2-2、Sentinel (分布式流控)2-3、RocketMQ (消息队列)/RabbitMq/kafka2-4、Seata (分布式事务)2-5、Dubbo (RPC) 三、为什么大家看好 Spring Cloud Alibaba3-1、阿里巴巴强大的技术输出…

使用责任链模式实现登录风险控制

责任链模式 责任链模式是是设计模式中的一种行为型模式。该模式下&#xff0c;多个对象通过next属性进行关系关联&#xff0c;从而形成一个对象执行链表。当发起执行请求时&#xff0c;会从首个节点对象开始向后依次执行&#xff0c;如果一个对象不能处理该请求或者完成了请求…

福建科立讯通信 指挥调度管理平台RCE漏洞复现

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案&#xff0c;以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设…

一文让你了解网络刷卡器的特点和优势

网络刷卡器一款高性能的多协议电子标签读写器&#xff0c;保持高识读率的同时实现对电子标签的快速读写处理&#xff0c;广泛应用于物流追踪、个人身份识别、人员管理、智能停车场、门禁考勤、公交一卡通、餐饮、金融等多个领域。 特点和优势&#xff1a; 1&#xff09;低功耗、…

知识管理工具zotero的数据迁移工作

工作中一直使用zotero来管理一些有价值的文档&#xff0c;时间长了这个数据库的大小也是很大的&#xff0c;如果有调整电脑的需求&#xff0c;那么这个数据库就要随之迁移&#xff0c;zotero有两种数据迁移方式&#xff0c;一种是云同步&#xff0c;需要买zotero的容量&#xf…

【FastCAE源码阅读8】调用gmsh生成网格

FastCAE使用gmsh进行网格划分&#xff0c;划分的时候直接启动一个新的gmsh进程&#xff0c;个人猜测这么设计是为了规避gmsh的GPL协议风险。 进行网格划分时&#xff0c;其大体运行如下图&#xff1a; 一、Python到gmshModule模块 GUI操作到Python这步不再分析&#xff0c;比…