(面试题)数据结构:链表相交

news2024/12/28 20:26:16

问题:有两个链表,如何判断是否相交,若相交,找出相交的起始节点

一、介绍

链表相交:

若两个链表相交,则两个链表有共同的节点,那从这个节点之后,后面的节点都会重叠,知道链表结束。若相交,则两个链表呈Y形。

二、解法

1.暴力解:

分别遍历两条链表,观察是否有相同的节点。 在遍历第一条链表的同时也遍历第二条链表,第一次找到相同的节点即位第一个交点,若第一条链表遍历完之后,未找到相同的节点,则不存在交点

2.栈:(更推荐)

创建两个栈,将两个链表分别存入两个栈中,入栈结束后,只需通过top栈顶指针的值判断是否相同即可判断两个链表是否相交。栈顶元素相同,则两链表相交。若相交,则让两个栈循环出栈,直到遇到两个出栈的节点不相同,则这个节点的后一个节点就是一个相交的节点。

三、代码

例:

1.申明链表和栈的结构体

#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 7

//链表的结构体
typedef struct link_list{
	union{
		int data;
		int len;
	};
	struct link_list *next;
}link_list,*list_p;

//桟的结构体
typedef struct seq_stack{
	int data[MAX];
	int top;
}seq_stack,*seq_p;

//创建头节点
list_p creat_head();
//创建节点
list_p creat_node(int data);
//头插
void insert_head(list_p H,int data);
//尾插
void insert_tail(list_p H,int data);
//遍历输出
void out_put(list_p H);


//创建顺序桟
seq_p creat_stack();
//判空
int empty_stack(seq_p S);
//判满
int full_stack(seq_p S);
//入桟
void push_stack(seq_p S,int data);
//出桟
int pop_stack(seq_p S);


#endif

2.链表的创建头节点、创建节点、头插、尾插、遍历输出

#include "link_list.h"

//创建头节点
list_p creat_head(){
	list_p H=(list_p)malloc(sizeof(link_list));
	if(H==NULL){
		printf("空间申请失败\n");
		return NULL;
	}
	H->next=NULL;
	H->len=0;
	return H;
}
//创建节点
list_p creat_node(int data){
	list_p new=(list_p)malloc(sizeof(link_list));
	if(new==NULL){
		printf("空间申请失败\n");
		return NULL;
	}
	new->data=data;
	return new;
}
//头插
void insert_head(list_p H,int data){
	if(H==NULL){
		printf("空间申请失败\n");
		return;
	}
	list_p new=creat_node(data);
	new->next=H->next;
	H->next=new;
	H->len++;

}
//尾插
void insert_tail(list_p H,int data){
	if(H==NULL){
		printf("空间申请失败\n");
		return;
	}
	list_p p=H;
	while(p->next!=NULL){
		p=p->next;
	}
	list_p new=creat_node(data);
	new->next=p->next;
	p->next=new;
	H->len++;

}
//遍历输出
void out_put(list_p H){
	if(H==NULL){
		printf("空间申请失败\n");
		return;
	}
	list_p p=H->next;
	while(p!=NULL){
		printf("%d ",p->data);
		p=p->next;
	}
	putchar(10);
}

3.栈的创建顺序栈、判空、判满、入栈、出栈

//创建顺序桟
seq_p creat_stack(){
	seq_p S=(seq_p)malloc(sizeof(seq_stack));
	if(S==NULL){
		printf("空间申请失败\n");
		return NULL;
	}
	S->top=-1;
	return S;
}
//判空
int empty_stack(seq_p S){
	if(S==NULL){
		printf("空间申请失败\n");
		return -1;
	}
	return S->top==-1?1:0;

}
//判满
int full_stack(seq_p S){
	if(S==NULL){
		printf("空间申请失败\n");
		return -1;
	}
	return S->top==MAX?1:0;
}
//入桟
void push_stack(seq_p S,int data){
	if(S==NULL){
		printf("空间申请失败\n");
		return;
	}
	if(full_stack(S)){
		printf("桟满,不能插入\n");
		return;
	}
	S->top++;
	S->data[S->top]=data;
}
//出桟
int pop_stack(seq_p S){
	if(S==NULL){
		printf("空间申请失败\n");
		return -1;
	}
	if(empty_stack(S)){
		printf("桟空\n");
		return 0;
	}
	return S->data[S->top];
}

4.main函数

#include "link_list.h"
int main(){
	list_p H1=creat_head();
	list_p H2=creat_head();
	seq_p S1=creat_stack();
	seq_p S2=creat_stack();
	insert_tail(H1,1);
	insert_tail(H1,3);
	insert_tail(H1,5);
	insert_tail(H1,8);
	insert_tail(H1,10);
	insert_tail(H2,2);
	insert_tail(H2,4);
	insert_tail(H2,6);
	insert_tail(H2,8);
	insert_tail(H2,10);
	printf("链表1为: ");
	out_put(H1);
	printf("链表2为: ");
	out_put(H2);
	list_p p1=H1->next;
	list_p p2=H2->next;

	//将两链表的值传入两个桟中
	while(p1!=NULL){
		push_stack(S1,p1->data);
		p1=p1->next;
	}
	while(p2!=NULL){
		push_stack(S2,p2->data);
		p2=p2->next;
	}
	//判断两个桟的桟顶元素是否相等
	if(S1->data[S1->top]==S2->data[S2->top]){
		printf("两链表相交\n");
		//判断出相交了之后,让两桟循环出桟,找到一个不相同的元素
		//这个元素的后一个元素就是第一次相交的节点
		while(empty_stack(S1)!=1 && empty_stack(S2)!=1){
			if(pop_stack(S1)!=pop_stack(S2)){
				printf("相交的节点为%d\n",S1->top+1);
				break;
			}
			S1->top--;
			S2->top--;
		}
	}
	else
		printf("两链表不相交\n");


}

四、效果演示 

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

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

相关文章

一些可以访问gpt的方式

1、Coze扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力&#xff0c;扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体&#xff0c;并发布到豆包、飞书等各个平台。https://www.coze.cn/ 2、https://poe.com/ 3、插件阿里…

Android Compose - PlainTooltipBox(已废弃)的替代方案

Android Compose - PlainTooltipBox 的替代方案 TooltipBox(positionProvider TooltipDefaults.rememberPlainTooltipPositionProvider(),tooltip {PlainTooltip {Text(/* tooltip content */)}},state rememberTooltipState(), ) {// tooltip anchorIconButton(onClick {…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 附录B 从《C++ Primer(第4版)》入手学习C++

这是作者为《C Primer&#xff08;第4版&#xff09;&#xff08;评注版&#xff09;》写的序言&#xff0c;文中“本书”指的是这本书评注版。 B.1 为什么要学习C 2009年本书作者Stanley Lippman先生应邀来华参加上海祝成科技举办的C技术大会&#xff0c;他表示人们现在还用…

手势识别应用介绍

目录 一、功能介绍 二、安装部署说明 2.1 文件目录说明 2.2 手势识别部分 一、功能介绍 这是一个通过摄像头捕获手势&#xff0c;根据不同的手势来做出不同操作的计算机程序。目前可以识别9种手势&#xff0c;可以根据识别到的手势&#xff0c;进行打开应用、增大音量、减小音量…

抖音视频批量采集软件|视频评论下载工具

在日常工作中&#xff0c;需要频繁下载抖音视频&#xff0c;但逐个复制分享链接下载效率太低&#xff1f;别担心&#xff01;我们推出了一款专业的抖音视频批量采集软件&#xff0c;基于C#开发&#xff0c;满足您的需求&#xff0c;让您通过关键词搜索视频并自动批量抓取&#…

swoole

php是单线程。php是靠多进程来处理任务&#xff0c;任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…

SMBGhost漏洞技术分析与防御方案

事件分析 最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告&#xff0c;笔者利用周末休息时间也研究了一下&#xff0c;就算是做一个笔记了&#xff0c;分享给大家一起学习下&#xff0c;目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出…

腾讯云幻兽帕鲁服务器操作系统选择Windows还是Linux?哪个比较好?

选择Windows和Linux作为腾讯云幻兽帕鲁服务器的操作系统&#xff0c;主要取决于用户的熟悉程度和对服务器性能的需求。 如果用户对Linux系统有较深的了解&#xff0c;并且追求服务器的性能和速度&#xff08;因为Linux通常使用命令行或面板管理&#xff0c;系统文件占用较小&a…

数据分析-Pandas数据的探查蜂窝图

数据分析-Pandas数据的探查蜂窝图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

【双指针】合并两个有序数组O(N)

合并两个有序数组 链接 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/merge-sorted-array/ 题目 题解 采用双指针…

怎么优雅地访问ChatGPT

ChatGPT&#xff0c;这颗璀璨的智能结晶&#xff0c;在2022年岁末之际&#xff0c;由OpenAI实验室倾力铸就&#xff0c;犹如夜空中跃动的智慧星辰&#xff0c;点亮了人工智能领域的新纪元。犹如汪洋中的一座灯塔&#xff0c;ChatGPT以其独特的智慧光辉引人注目&#xff0c;然而…

【hive Hadoop】踩坑 记录

【hive & Hadoop】踩坑 记录 平台部署知识 本文记录的配置 hive Hadoop 时可能会出现的问题以及解决方案。 目录 文章目录 【hive & Hadoop】踩坑 记录目录Hive记录hive 启动报错 Permission denied Unable to determine Hadoop version information.原因解释本次的解…

Compiling from source on UNIX(cmake doxygen ant maven ccache)

前言 源码链接 cmake-3.18.0 https://cmake.org/files/v3.18/cmake-3.18.0.tar.gzdoxygen-1.10.0 https://www.doxygen.nl/files/doxygen-1.10.0.src.tar.gzapache-ant-1.10.8-bin https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.tar.gzapache-maven-3…

MySQL相关知识汇总

MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;它以其高性能、稳定性和易用性而备受开发者喜爱。在软件开发领域&#xff0c;无论是大型项目还是小型应用&#xff0c;MySQL都扮演着重要的角色。本文将对MySQL的一些关键知识点进行汇总&#xff0c;帮助读者更好地了…

【MySQL】表的约束——空属性、默认值、列描述、zerofill、主键、自增长、唯一键、外键

文章目录 MySQL表的约束1. 空属性2. 默认值3. 列描述4. zerofill5. 主键6. 自增长7. 唯一键8. 外键 MySQL 表的约束 MySQL中的表的约束是一种规则&#xff0c;用于限制或保护表中数据的完整性和合法性。约束可以确保数据在插入、更新或删除时满足特定的条件&#xff0c;从而维护…

【C++】核心编程--类与对象(持续更新)

文章目录 1. 封装1.1封装的意义1.1.1封装意义一&#xff1a;属性和行为1.1.2封装的意义二&#xff1a;访问权限 1.2 struct和class的区别1.3 成员属性设置为私有 2.对象特性2.1 构造函数和析构函数2.2构造函数的分类及调用2.3 拷贝构造函数调用时机2.4 构造函数调用规则2.5深拷…

Flink基本原理 + WebUI说明 + 常见问题分析

Flink 概述 Flink 是一个用于进行大规模数据处理的开源框架&#xff0c;它提供了一个流式的数据处理 API&#xff0c;支持多种编程语言和运行时环境。Flink 的核心优点包括&#xff1a; 低延迟&#xff1a;Flink 可以在毫秒级的时间内处理数据&#xff0c;提供了低延迟的数据…

架构(十五)Java字节码增强

一、引言 一般如果需要做增强类的架构工具会使用SpringBoot提供的切面&#xff0c;但是这逃不开两个问题&#xff1a;1、使用方需要加注解代码&#xff1b;2、版本更新导致的发布。 所以java还提供了字节码层面的增强方案&#xff0c;对使用的系统是无感的。 二、字节码增强选…

数独游戏(dfs)

代码注释如下 #include <iostream> using namespace std; const int N 10; bool col[N][N], rol[N][N], cell[3][3][N]; char g[N][N]; bool dfs(int x, int y) { //用bool这样在找到一个方案就可以迅速退出if(y 9) x, y 0; //若y超出边界&#xff0c;则第二…

李沐动手学习深度学习——3.6练习

本节直接实现了基于数学定义softmax运算的softmax函数。这可能会导致什么问题&#xff1f;提示&#xff1a;尝试计算exp(50)的大小。 可能存在超过计算机最大64位的存储&#xff0c;导致精度溢出&#xff0c;影响最终计算结果。 本节中的函数cross_entropy是根据交叉熵损失函数…