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

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

一、介绍

链表相交:

若两个链表相交,则两个链表有共同的节点,那从这个节点之后,后面的节点都会重叠,知道链表结束。若相交,则两个链表呈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");


}

四、效果演示 

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

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

相关文章

推荐五本程序员必看书籍!

昨天推送的是视频&#xff0c;今天给大家推荐基本入门渗透测试的好书&#xff0c;以结合昨天文章一起学习&#xff0c;忘记了的可以回复“学习之路”会自动跳出文章的&#xff0c;好的话不多说&#xff0c;直接上主菜了&#xff01; 第一本当然是我们网络基础的书&#xff0c;…

SpringMVC了解

1.springMVC概述 Spring MVC&#xff08;Model-View-Controller&#xff09;是基于 Java 的 Web 应用程序框架&#xff0c;用于开发 Web 应用程序。它通过将应用程序分为模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&a…

快递平台独立版小程序源码|带cps推广营销流量主+前端

源码介绍&#xff1a; 快递代发快递代寄寄件小程序可以对接易达云洋一级总代 快递小程序&#xff0c;接入云洋/易达物流接口&#xff0c;支持选择快递公司&#xff0c;三通一达&#xff0c;极兔&#xff0c;德邦等&#xff0c;功能成熟 如何收益: 1.对接第三方平台成本大约4元…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题&#xff08;十分十分的巧妙&#xff09;&#xff1a; 显然我们应该一行一行放&#xff0c;又竖的会对下一行产生影响&#xff0c;我们令横着放为0&#xff0c;竖着放的上方为1. 对于下一行&#xff0c;前一行放1的下面为0&#xff0c;但是会出现…

C++指针(三)

个人主页:PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数&#xff0c;指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…

论文阅读_代码生成模型_CodeLlama

英文名称: Code Llama: Open Foundation Models for Code 中文名称: Code Llama&#xff1a;开放基础代码模型 链接: https://arxiv.org/abs/2308.12950 代码: https://github.com/facebookresearch/codellama 作者: Baptiste Rozire, Jonas Gehring, Fabian Gloeckle, Sten So…

微信小程序云开发教程——墨刀原型工具入门(文件设置+编辑组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

C++STL之vector

vector 1. vector介绍 vector文档vector其实就是一个顺序表&#xff0c;它表示可变大小数组的序列容器。像数组一样&#xff0c;可以使用下标[] 来访问vector的元素&#xff0c;和数组一样高效&#xff1b;甚至&#xff0c;它的大小是可以动态改变的&#xff0c;其大小由容器自…

广和通5G智能模组SC171支持Android、Linux和Windows系统,拓宽智能物联网应用

世界移动通信大会2024期间&#xff0c;广和通宣布&#xff1a;5G智能模组SC171除支持Android操作系统外&#xff0c;还兼容Linux和Windows系统&#xff0c;帮助更多智能终端客户快速迭代产品&#xff0c;拓宽智能化应用覆盖范围。 广和通SC171系列基于高通QCM6490物联网解决方案…

Redis安全加固策略:服务账号管理 开启redis密码认证 开启防护模式

Redis安全加固策略&#xff1a;服务账号管理 & 开启redis密码认证 & 开启防护模式 1.1 服务账号管理1.1.1 检测方法1.1.2 加固参考配置操作 1.2 开启redis密码认证1.2.1 检测方法1.2.2 加固参考配置操作 1.3 开启防护模式1.3.1 检测方法1.3.2 加固参考配置操作 &#x…

图神经网络实战——基于DeepWalk创建节点表示

图神经网络实战——基于DeepWalk创建节点表示 0. 前言1. Word2Vec1.1 CBOW 与 skip-gram1.2 构建 skip-gram 模型1.3 skip-gram 模型1.4 实现 Word2Vec 模型 2. DeepWalk 和随机行走3. 实现 DeepWalk小结系列链接 0. 前言 DeepWalk 是机器学习 (machine learning, ML) 技术在图…

【NR 定位】3GPP NR Positioning 5G定位标准解读(三)

目录 前言 5 NG-RAN UE定位架构 5.1 架构 5.2 UE定位操作 5.3 NG-RAN定位操作 5.3.1 通用NG-RAN定位操作 5.3.2 OTDOA定位支持 5.3.3 广播辅助信息支持 5.3.4 NR RAT相关定位支持 5.4 NG-RAN中与UE定位相关的元素功能描述 5.4.1 用户设备&#xff08;UE&#xff09; …

寻址错题本

指令寻址 顺序寻址 通过程序计数器PC自动加1,形成下一条指令的指令地址。 跳跃寻址 通过转移类指令实现跳转到指定的代码段或者子程序。 数据寻址 直接寻址 形式地址A就是操作数的地址EA,执行阶段访问一次存储器。 所以当我们需要取得实际的值(操作数)的时候: 第一步:…

项目实战 MySQL读写分离【构建主从结构数据库(查从库)(增删改主库)】【ShardingJDBC实现读写分离】

项目实战 MySQL读写分离 1. MySQL主从复制1.1 介绍1.2 搭建1.2.1 准备工作1.2.3 从库配置 2. 读写分离案例2.2 ShardingJDBC介绍 转自-黑马 在前面基础功能实现的过程中&#xff0c;我们后台管理系统及移动端的用户&#xff0c;在进行数据访问时&#xff0c;都是直接操作数据库…

MYSQL---日志

1.日志的概述 日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化&#xff1b;也就是说用来记录MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时&#xff0c;可以通过日志查看文件出错的原因&#xff0…

自定义类型(结构体、枚举、联合体)内存大小的计算方法

内存对齐 为什么会存在内存对齐&#xff1f; 大部分参考资料是这么说的&#xff1a; 平台原因(移植原因)&#xff1a; 不是所有的硬件平台都能访问任意地址上的任意数据的&#xff1b;某些硬件平台只能在某些地址处取某些特定类型的数据&#xff0c;否则抛出硬件异常。性能原…

LeetCode---386周赛

题目列表 3046. 分割数组 3047. 求交集区域内的最大正方形面积 3048. 标记所有下标的最早秒数 I 3049. 标记所有下标的最早秒数 II 一、分割数组 这题简单的思维题&#xff0c;要想将数组分为两个数组&#xff0c;且分出的两个数组中数字不会重复&#xff0c;很显然一个数…

Apache Flink连载(三十七):Flink基于Kubernetes部署(7)-Kubernetes 集群搭建-2

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

BUGKU 网站被黑

打开环境&#xff0c;什么都没发现&#xff0c;使用蚁剑扫描一下&#xff0c;发现shell.php&#xff0c;打开 使用BP抓包&#xff0c;进行爆破 得到密码&#xff1a;hack 进去得到flag

Vins-Moon配准运行

Vins-Moon运行 源码地址电脑配置环境配置编译适配Kitti数据集运行结果Euroc数据集kitti数据集 evo评估&#xff08;KITTI数据&#xff09;输出轨迹(tum格式)结果 源码地址 源码链接&#xff1a;https://github.com/HKUST-Aerial-Robotics/VINS-Mono.git 电脑配置 Ubuntu 18.…