链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)

AB链表公共元素生成链表C

设A和B是两个单链表(带头节点),其中元素递增有序。设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A、B的节点

算法思想

表A,B都有序,可从第一个元素起依次比较A、B两表的元素,若元素值不等,则值小的值往后移,若元素值相等,则创建一个值等于两节点的元素值的新节点,使用尾插法插入到新的链表中,并将两个原表指针后移一位,直到其中一个链表遍历到表尾
![[Pasted image 20241104203653.png]]

cura小于curb,cura指向cura的next
![[Pasted image 20241104203707.png]]

cura等于curb,malloc一个new节点
![[Pasted image 20241104203725.png]]

curc的next指向new
![[Pasted image 20241104203747.png]]

curc指向new
![[Pasted image 20241104203811.png]]

cura和curb往后遍历

void GetCommon(LinkList &A, LinkList &B)
{
	LNode* cura = A->next, *curb = B->next, *curc, *new;
	LinkList C = (LinkList)malloc(sizeof(LNode));
	curc = C;

	while (cura && curb)
	{
		if (cura->data < curb->data)
			cura = cura->next;
		else if (cura->data > curb->data)
			curb = curb->next;
		else
		{
			new = (LNode*)malloc(sizeof(LNode));
			new->data = cura->data;
			curc->next = new;
			curc = new;
			cura = cura->next;
			curb = curb->next;
		}
	}
	curc->next = NULL;
}

一个工作指针cura用来遍历链表A,一个工作指针curb用来遍历链表B,一个工作指针curc用来建立链表C,一个指针new用来创建共同节点的新节点尾插到C链表上
最开始malloc一个C链表的头节点,将curc指向C链表的头节点
cura和curb开始分别遍历链表A和B
当cura小于curb或者curb小于cura时,小的那一个往后遍历一个节点
当cura等于curb时,malloc一个新节点,使其值等于cura或curb,并将其尾插到C链表上
cura和curb继续往后遍历,直到其中一个指针指向NULL
最后将curc指向NULL

AB链表交集存放于A

已知两个链表A和B分别表示两个集合,其元素递增排列,编制函数,求A与B的交集,并存放于A链表中

算法思想

采用归并的思想,设置两个工作指针cura和curb,对两个链表进行归并扫描,只有同时出现在两集合中的元素才链接到结果表中且仅保留一个,其他的节点全部释放。当一个链表遍历完毕后,释放另一个表中剩下的全部节点
![[Pasted image 20241104210025.png]]

cura小于curb,删除cura
用del指向cura,cura指向cura的next
![[Pasted image 20241104210120.png]]

free掉del
![[Pasted image 20241104210148.png]]

cura等于curb
curc的next指向cura,curc指向cura,cura指向cura的next
![[Pasted image 20241104210253.png]]

del指向curb,curb指向curb的next
![[Pasted image 20241104210323.png]]

free掉del
![[Pasted image 20241104210336.png]]

LinkList Union(LinkList &La, LinkList &Lb)
{
	LNode* cura = La->next;
	LNode* curb = Lb->next;
	LNode* curc = La;
	LNode* del;

	while (cura && curb)
	{
		if (cura->data == curb->data)
		{
			curc->next = cura;
			curc = cura;
			cura = cura->next;
			del = curb;
			curb = curb->next;
			free(del);
		}
		else if (cura->data < curb->data)
		{
			del = cura;
			cura = cura->next;
			free(del);
		}
		else
		{
			del = curb;
			curb = curb->next;
			free(del);
		}
	}
	while (cura)
	{
		del = cura;
		cura = cura->next;
		free(del);
	}
	while (curb)
	{
		del = curb;
		curb = curb->next;
		free(del);
	}
	curc->next = NULL;
	free(Lb);
	return La;
}

cura指针用来遍历链表A,curb用来遍历链表B,curc来指向归并的结果的表头位置,题目要求归并到链表A,所以curc指向La
指针del指向要删除的节点
cura和curb分别从链表A和B的第一个节点开始遍历,其中一个链表遍历结束时,循环结束
当cura等于curb,将cura尾插到curc后面,用del指针删除掉curb
当cura小于curb,删除掉cura
当curb小于cura,删除掉curb
当循环结束后,如果cura不指向NULL,表明链表A中还有剩余的元素,全部删除
如果curb不指向NULL,表明链表B中还有剩余的元素,全部删除
最后将curc的next指向NULL
删除掉链表B的头节点Lb
返回链表A的头节点La

连续子序列

两个整数序列 A = a 1 , a 2 , a 3 , … , a m A=a_{1},a_{2},a_{3},\dots,a_{m} A=a1,a2,a3,,am B = b 1 , b 2 , b 3 , … , b n B=b_{1},b_{2},b_{3},\dots,b_{n} B=b1,b2,b3,,bn已经存入两个单链表中,设计一个算法,判断序列B是否是序列A的连续子序列

算法思想

因为两个整数序列已存入两个链表中,操作从两个链表的第一个节点开始,若对应数据相等,则后移指针;若对应数据不相等,则A链表从上次开始比较节点的后继开始,B链表仍从第一个节点开始比较,直到B链表到尾表示匹配成功。
A链表到尾而B链表未到尾白哦是失败
操作中应该记住A链表每次开始的节点,以便下次匹配好从其后继开始
![[Pasted image 20241104211850.png]]

cura等于curb,往后遍历
![[Pasted image 20241104211921.png]]

cura不等于curb
prev指向prev的next,cura等于prev,curb指向B
![[Pasted image 20241104212014.png]]

cura不等于curb
![[Pasted image 20241104212039.png]]

cura等于cura,继续遍历

bool Pattern (LinkList &A, LinkList &B)
{
	LNode* cura = A;
	LNode* prev = cura;
	LNode* curb = B;

	while (cura && curb)
	{
		if (cura->data == curb->data)
		{
			cura = cura->next;
			curb = curb->next;
		}
		else
		{
			prev = prev->next;
			cura = prev;
			curb = B;
		}
	}
	if (curb == NULL)
		return true;
	else
		return false;
}

用cura指针来遍历链表A,用cur指针来遍历链表B,用prev指针保存上一次A链表比较的节点,下一轮直接从prev的后继节点开始
cura和curb开始同时遍历,当cura和curb其中一个指向NULL,循环结束
当cura等于curb时,继续往后比较链表A和链表B的剩余部分
当cura不等于curb时
prev指向prev的next,也就是A链表开始比较的节点往后走一个
cura指向prev,curb重新指向链表B的表头,开始新的一轮比较
循环结束后,如果curb指向NULL,表示链表B的curb都等于对应的cura,链表B是链表A的连续子序列
否则就不是

相交链表求交点位置

假定采用带头节点的单链表保存单词,当两个单词有相同后缀时,可共享相同的后缀存储空间
如loading和being
![[Pasted image 20241104200916.png]]

设str1和str2分别指向两个单词所在单链表的头节点
设计一个算法,找出由str1和str2所指向两个链表共同后缀的起始位置,也就是两个链表的交点

算法思想

顺序遍历两个链表到尾节点时,不能保证两个链表同时达到尾节点
假设一个链表比另一个链表长k个节点,现在长链表上遍历k个节点
之后同步遍历两个链表,这样就能保证它们同时达到最后节点
这时候每次遍历两两比较两个链表的节点,如果两个遍历的指针相等,就表示两个链表相交,第一个相等的节点就是交点

  1. 分别求出str1和str2所指的两个链表的长度m和n
  2. 将两个链表以表尾对齐:两个指针分别指向str1和str2的头节点,长的链表先走k个节点,也就是走到第 ∣ m − n ∣ + 1 |m-n|+1 mn+1个节点,
  3. 之后两个指针同步往后遍历,判断它们是否指向同一个节点
    ![[Pasted image 20241104214225.png]]

str1,走m-n步,也就是1步
![[Pasted image 20241104214343.png]]

开始同时遍历
**![[Pasted image 20241104214412.png]]**

直到cur1和cur2指向同一个节点为止

typedef struct Node
{
	char data;
	struct Node* next;
}SNode;

int ListLen (SNode* head)
{
	int len = 0;
	while (head->next)
	{
		len++;
		head = head->next;
	}
	return len;
}

SNode* findList(SNode* str1, SNode* str2)
{
	int m, n;
	SNode* cur1, *cur2;
	m = ListLen(str1);             //求str1的长度
	n = ListLen(str2);             //求str2的长度
	for (cur1 = str1; m > n; m--)  //若m>n,使cur1后移m-n步
		cur1 = cur1->next;
	for (cur2 = str2; m < n; n--)  //若n>m,使cur2后移n-m步
		cur2 = cur2->next;
	// 查找交点
	while (cur1->next && cur1->next != cur2->next)
	{
		//两个指针同步向后移动
		cur1 = cur1->next;
		cur2 = cur2->next;
	}
	return cur1->next;             //返回相交链表的交点
}

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

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

相关文章

蓝牙BLE开发——红米手机无法搜索蓝牙设备?

解决 红米手机&#xff0c;无法搜索附近蓝牙设备 具体型号当时忘记查看了&#xff0c;如果你遇到有以下选项&#xff0c;记得打开~ 设置权限

2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能

基于matlab-GUI的脉冲响应不变法实现音频滤波功能&#xff0c;输入加噪信号&#xff0c;通过巴特沃斯模拟滤波器脉冲响应不变法进行降噪。效果较好。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能…

智慧生活新标准:解锁耐能科技的潜能

『从马路上&#xff0c;看到旁边摄影机下方的牌子写着科技执法』 『开车进入停车场时&#xff0c;车牌辨识成功开启闸门』 『回到家门口前&#xff0c;进行脸部辨识解锁开门』 『手机APP弹起提醒&#xff0c;出现宝宝的画面表示正在哭泣』 上述的情景&#xff0c;你我是否很熟悉…

[VUE]框架网页开发1 本地开发环境安装

前言 其实你不要看我的文章比较长&#xff0c;但是他就是很长&#xff01;步骤其实很简单&#xff0c;主要是为新手加了很多解释&#xff01; 步骤一&#xff1a;下载并安装 Node.js 访问 Node.js 官网&#xff1a; Node.js — Download Node.js 下载 Windows 64 位版本&…

C++线程异步

本文内容来自&#xff1a; 智谱清言 《深入应用C11 代码优化与工程级应用》 std::future std::future作为异步结果的传输通道&#xff0c;可以很方便地获取线程函数的返回值。 std::future_status Ready (std::future_status::ready): 当与 std::future 对象关联的异步操作…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分&#xff0c;图形显示有所变化&#xff0c;美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

后端eclipse——文字样式:UEditor富文本编辑器引入

目录 1.富文本编辑器的优点 2.文件的准备 3.文件的导入 导入到项目&#xff1a; 导入到html文件&#xff1a; ​编辑 4.富文本编辑器的使用 1.富文本编辑器的优点 我们从前端写入数据库时&#xff0c;文字的样式具有局限性&#xff0c;不能存在换行&#xff0c;更改字体…

基于springboot+小程序的汽车销售管理系统(汽车4)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 1、管理员实现了首页、个人中心、管理员管理、基础数据管理、论坛管理、公告信息管理、汽车管理、用户管理、轮播图信息等。 ​ 2、用户实现了注册、登录、首页、汽车类型、论坛、购物…

江协科技STM32学习- P29 实验- 串口收发HEX数据包/文本数据包

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Quartz的使用

1.准备工作 建立Maven工程 2.引入Quartz的jar包 <dependencies><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version></dependency></dependencies>3…

黑马官网最新2024前端就业课V8.5笔记---CSS篇(2)

盒子模型 画盒子 目标:使用合适的选择器画盒子 新属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vi…

单片机串口接收状态机STM32

单片机串口接收状态机stm32 前言 项目的芯片stm32转国产&#xff0c;国产芯片的串口DMA接收功能测试不通过&#xff0c;所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣&#xff0c;不过我的芯片已经主频跑…

Android Studio 安装过程

以前用 Eclipse 开发&#xff0c;最近尝试 Android Studio 开发&#xff0c;发现 Android Studio 比 Eclipse 速度快多了&#xff0c;下面是安装 Android Studio 过程日志。 Gradle 下载地址&#xff1a;https://services.gradle.org/distributions/ https://developer.andro…

github.io出现的问题及解决方案

1. 你的连接不是专用连接 放假回家后打开自己的博客&#xff0c;发现无法打开博客&#xff0c;一开始以为是调样式时不小心搞坏了&#xff0c;打开别人的githunb.io博客发现都会出问题&#xff0c;并且用手机不连接wifi可以正常打开 解决办法&#xff1a; 方法一&#xff1a; …

商场应急管理措施和预案|基于springboot+vue的大型商场应急预案管理系统(源码+数据库+文档)

商场应急管理系统 目录 基于springbootvue的大型商场应急预案管理系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

【ACM出版,EI稳定检索】2024年人工智能、数字媒体技术与交互设计国际学术会议(ICADI 2024,11月29-12月1日)

2024年人工智能、数字媒体技术与交互设计国际学术会议&#xff08;ICADI 2024) 2024 International Conference on Artificial Intelligence, Digital Media Technology and Interaction Design 官方信息 会议官网&#xff1a;www.icadi.net 2024 International Conference o…

【Linux】命令行参数 | 环境变量

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 前几天在搞硬件&…

Stable diffusion 3.5本地运行环境配置记录

1.环境配置 创建虚环境 conda create -n sd3.5 python3.10Pytorch(>2.0) conda install pytorch2.2.2 torchvision0.17.2 torchaudio2.2.2 pytorch-cuda12.1 -c pytorch -c nvidiaJupyter能使用Anaconda虚环境 conda install ipykernel python -m ipykernel install --user …

CODESYS可视化星三角降压启动程序控制电气动画图

#一个用CODESYS可视化做的星三角降压启动程序控制电气动画图# 前言: 关于星三角降压启动控制,作为电气行业入门的必备知识点,涉及到电机本身特性导致的电压,电流(转矩),功率和转速等一系列的关系和变化,以及星型和三角形的绕组方式。本篇我们使用CODESYS结合程序和可视…

安装fpm,解决*.deb=> *.rpm

要从生成 .deb 包转换为 .rpm 包&#xff0c;可以按照以下步骤修改打包脚本 1. 使用 fpm 工具 fpm 是一个强大的跨平台打包工具&#xff0c;可以将 .deb 包重新打包成 .rpm&#xff0c;也可以直接从源文件打包成 .rpm。 安装 fpm sudo apt-get install ruby-dev sudo gem in…