链表归并与并集相关算法题|两递增归并为递减到原位|b表归并到a表|两递减归并到新链表(C)

news2024/11/23 19:22:36

两递增归并为递减到原位

假设有两个按元素递增次序排列的线性表,均以单链表形式存储。将这两个单链表归并为一个按元素递减次序排列的单链表,并要求利用原来两个单链表的节点存放归并后的单链表

算法思想

因为两链表已按元素值递增次序排列,将其合并时,均从第一个节点起进行比较,将小的链入链表中,同时后移链表工作指针
要求结果链表按元素值递减次序排列,在归并的同时,将链表节点逆置
![[Pasted image 20241110144022.png]]

将la断开,置为NULL
![[Pasted image 20241110144109.png]]

cura和curb开始遍历,取小的头插,相当于逆置
cura<curb,
用next保存cura的下一个节点
![[Pasted image 20241110144251.png]]

将cura的next指向la的next,即NULL
![[Pasted image 20241110144344.png]]

la的next指向cura
![[Pasted image 20241110144407.png]]

cura指向next
![[Pasted image 20241110144430.png]]

完成头插

LinkList Union(LinkList la, lb)
{
	// cura和curb分别是链表A和B的工作指针,next保存下一个节点
	LNode* cura = la->next, *curb = lb->next, *next;
	la->next = NULL;      // la作结果链表的头指针,先将结果链表置为NULL

	while (cura && curb)
	{
		if (cura->data <= curb->data)
		{
			// 将cura的后继节点存于next
			next = cura->next;
			// 将cura节点链于结果表中,同时逆置
			cura->next = la->next;
			la->next = cura;
			// 恢复cura为当前待比较节点
			cura = next;
		}
		else
		{
			next = curb->next;
			curb->next = la->next;
			la->next = curb;
			curb = next;
		}
	}
	// 将la表剩余的部分链入结果表,并逆置
	// 两个while只能运行一个
	while (cura)
	{
		next = cura->next;
		cura->next = la->next;
		la->next = cura;
		cura = next;
	}
	while (curb)
	{
		next = curb->next;
		curb->next = la->next;
		la->next = curb;
		curb = next;
	}
	return la;
}

b表归并到a表

设有两个无头节点的单链表,头指针分别为ha,hb,两链表的数据都按递增次序存放,现要求将hb表归并到ha表中,且归并后ha仍为递增,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏

算法思想

由于无头节点,为方便建立头节点,最后删掉
数据相同的节点,不合并到结果链表中
hb表不能被破坏,即要归并的时候,要创建新节点

申请头节点la指向ha的头节点,cura和curb分别指向ha和hb的第一个节点,prev指针指向cura的前一个节点
![[Pasted image 20241110230637.png]]

cura和curb向后遍历,如果cura小于curb
prev的next指向cura,prev指向cura,cura指向它的下一个
![[Pasted image 20241110230831.png]]

如果cura大于curb
malloc一个new节点,使得new的data等于curb的data
![[Pasted image 20241110231033.png]]

prev的next指向new,prev指向new,curb指向它的下一个节点
![[Pasted image 20241110231213.png]]

如果cura等于curb
cura链入结果链表,curb继续往后遍历

LinkList Union(LinkList ha, hb)
{
	// 申请头节点,以便操作
	LinkList la;
	la = (LinkList)malloc(sizeof(LNode));
	la->next = ha;
	// cura时ha链表的工作指针
	LNode* cura = ha;
	// curb时hb的工作指针
	LNode* curb = hb;
	// prev指向当前待合并节点的前驱
	LNode* prev = la;

	while(cura && curb)
	{
		// 处理ha中的数据
		if (cura->data < curb->data)
		{
			prev->next = cura;
			prev = cura;
			cura = cura->next;
		}
		// 处理hb中的数据
		else if (cura->data > curb->data)
		{
			// 申请空间
			LNode* new = (LNode*)malloc(sizeof(LNode));
			// 将新节点链入结果链表			
			new->data = curb->data;
			prev->next = new;
			prev = new;
			// 链表中工作节点后移
			curb = curb->next;
		}
		// 处理cura->data == curb->data
		else
		{
			// 只要ha的数据
			prev->next = cura;
			prev = cura;
			cura = cura->next;
			// 不要hb的数据
			curb = curb->next;
		}
	}
	// 将两链表中剩余部分链入结果链表
	if (cura)
		prev->next = cura;
	if (curb)
		prev->next = curb;
	// 释放头节点
	free(la);
	return ha;
}

两递减归并到新链表

已知头指针分别为la和lb的带头节点的单链表中,节点按元素值非递减有序排列。
将la和lb两链表归并成一个节点按元素值非递减有序排列的单链表,头指针为lc

LinkList Union(LinkList &la, &lb)
{
	LNode* cura = la->next, curb = lb->next;
	LinkList lc = (LinkList)malloc(sizeof(LNode));
	LNode* curc = lc;

	while (cura && curb)
	{
		if (cura->data < curb->data)
		{
			curc->next = cura;
			curc = cura;
			cura = cura->next;
		}
		else
		{
			curc->next = curb;
			curc = curb;
			curb = curb->next;
		}
	}
	if (cura)
		curc->next = cura;
	if (curb)
			curc->next = curb;
	free(la);
	free(lb);
	return lc;
}

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

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

相关文章

【RabbitMQ】06-消费者的可靠性

1. 消费者确认机制 没有ack&#xff0c;mq就会一直保留消息。 spring:rabbitmq:listener:simple:acknowledge-mode: auto # 自动ack2. 失败重试机制 当消费者出现异常后&#xff0c;消息会不断requeue&#xff08;重入队&#xff09;到队列&#xff0c;再重新发送给消费者。…

【陕西】《陕西省省级政务信息化项目投资编制指南(建设类)(试行)》-省市费用标准解读系列07

《陕西省省级政务信息化项目投资编制指南&#xff08;建设类&#xff09;&#xff08;试行&#xff09;》规定了建设类项目的费用投资测算方法与计价标准&#xff0c;明确指出建设类项目费用包括项目建设费和项目建设其他费&#xff08;了解更多可直接关注咨询我们&#xff09;…

VB6.0桌面小程序(桌面音乐播放器)

干货源码 Imports System.IO Imports System.Security.Cryptography Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Button1.Text “上一曲” Button4.Text “播放” Button3.Text “下一曲” Button2.Text “顺序播…

docker安装jdk8

1、拉取镜像 docker pull openjdk:82、运行镜像 docker run -d --restartalways --network portainer_network -it --name jdk8 openjdk:8命令 作用 docker run 创建并启动一个容器 –name jdk8 将容器取名为jdk8 -d 设置后台运行 –restartalways 随容器启动 –network port…

【人工智能】Transformers之Pipeline(二十三):文档视觉问答(document-question-answering)

​​​​​​​ 目录 一、引言 二、文档问答&#xff08;document-question-answering&#xff09; 2.1 概述 2.2 impira/layoutlm-document-qa 2.2.1 LayoutLM v1 2.2.2 LayoutLM v2 2.2.3 LayoutXLM 2.2.4 LayoutLM v3 2.3 pipeline参数 2.3.1 pipeline对象实例化…

微服务day06

MQ入门 同步处理业务&#xff1a; 异步处理&#xff1a; 将任务处理后交给MQ来进行分发处理。 MQ的相关知识 同步调用 同步调用的小结 异步调用 MQ技术选型 RabbitMQ 安装部署 其中包含几个概念&#xff1a; publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 …

[CKS] K8S RuntimeClass SetUp

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于RuntimeClass创建和挂载的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS…

Halcon基于laws纹理特征的SVM分类

与基于区域特征的 SVM 分类不同&#xff0c;针对图像特征的 SVM 分类的算子不需要直接提取 特征&#xff0c;下面介绍基于 Laws 纹理特征的 SVM 分类。 纹理在计算机视觉领域的图像分割、模式识别等方面都有着重要的意义和广泛的应 用。纹理是指由于物体表面的物理属性不同所…

初始Python篇(6)—— 字符串

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 字符串的常见操作 格式化字符串 占位符 f-string 字符串的 format 方法 字符串的编码与解码 与数据验证相关的方法 …

基于Spring Boot+Vue的养老院管理系统【原创】

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…

Maven 中央仓库地址 mvnrepository.com

下载一些 jar 包驱动&#xff0c;不需用去官网下了&#xff0c;直接去 Maven 中央仓库&#xff0c;高效、简单 Maven 中央仓库地址 https://mvnrepository.com/open-source 我们下期见&#xff0c;拜拜&#xff01;

2024 年将 Postman 文档导出为 HTML 或 Markdown

2024 年将 Postman 文档导出为 HTML 或 Markdown

Anaconda安装库

相信有些人可能遇到pip直接安装失败&#xff0c;conda直接安装失败&#xff0c;pip镜像安装仍然失败的可能性&#xff0c;下面我记录一下我的一种解决方法。 我使用的是上面的miniconda3配置。 1.创建虚拟环境 首先&#xff0c;先新建一个虚拟环境 conda create -n py39 pyt…

linux命令详解,openssl+历史命令详解

openssl openssl是一个开源的加密工具包&#xff0c;提供了各种加密、解密、签名、验证等功能 openssl passwd -1 123password表示这个命令用于处理密码相关的操作&#xff0c;-1参数指定使用MD5加密算法对密码“123”进行加密处理。MD5是一种常用的哈希算法&#xff0c;它将…

Flink运行时架构以及核心概念

1.运行构架 1.提交作业后启动一个客户端进程&#xff0c;客户端解析参数&#xff08;-d -t 等等&#xff09;&#xff0c;后进行封装由Actor通信系统提交&#xff0c;取消&#xff0c;更新任务给JobManager。 2.JobManager&#xff08;进程&#xff09;通信系统一个组件叫分发…

解决C盘空间不足的三种方案

方案一&#xff1a;网上盛传的C盘磁盘碎片整理&#x1f9e9;&#xff08;原理&#xff1a;将分散的文件片段整理到相邻的磁盘区域&#xff0c;减少文件的碎片化程度&#xff09;(效果不明显) 方案二&#xff1a;把其他盘的空间给C盘 &#x1f4bd;&#xff08;效果显著&#xf…

echarts-gl 3D柱状图配置

1. 源码 此demo可以直接在echarts的编辑器中运行 option {title: {text: 产量图,textStyle: {color: rgba(255, 255, 255, 1),fontSize: 17},left: center},tooltip: {},legend: {show: false,orient: vertical,x: left,top: 0,right: 20,textStyle: {fontSize: 12}},visualM…

C++笔记---智能指针

1. 什么是智能指针 1.1 RALL设计思想 RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;是一种资源管理类的设计思想&#xff0c;广泛应用于C等支持对象导向编程的语言中。它的核心思想是将资源的管理与对象的生命周期紧密绑定…

「QT」几何数据类 之 QVector4D 四维向量类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

docker desktop运行rabittmq容器,控制台无法访问

docker desktop运行rabittmq容器&#xff0c;控制台无法访问 启动过程&#xff1a;…此处缺略&#xff0c;网上一大堆 原因 原因是在Docker上运行的RabbitMQ&#xff0c;默认情况下是没有启用管理插件和管理页面的 解决办法 使用命令 docker exec -it 容器id /bin/bash 进…