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

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

一、介绍

链表相交:

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

四、效果演示 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么把人物从图中抠出?分享几种好用的抠图方法

在日常生活中&#xff0c;我们时常需要将人物从繁杂的背景中优雅地提取出来&#xff0c;无论是为了制作一张精美的证件照&#xff0c;还是为了设计一幅引人注目的海报或宣传画。然而&#xff0c;对于许多非专业人士来说&#xff0c;这仿佛是一场与细节的捉迷藏游戏&#xff0c;…

Laravel Octane 和 Swoole 协程的使用分析二

又仔细研究了下 Octane 源码和 Swoole 的文档&#xff0c;关于前几天 Laravel Octane 和 Swoole 协程的使用分析中的猜想&#xff0c;得到进一步验证&#xff1a; Swoole 的 HTTP Server 启动后会创建一个 master 进程和一个 manager 进程&#xff1b;master 进程又会创建多个…

Python——Windows使用Nuitka2.0打包(保姆级教程)

目录 一、Python虚拟环境搭建 1.1、下载Python 1.2、使用 venv方法&#xff08;创建虚拟环境&#xff09; 1.3、进入虚拟环境 1.4、用pip下载项目需要的包&#xff08;与nuitka&#xff09; 二、 使用 Nuitka 打包 2.1、打包常用命令&#xff08;使用nuitka --help可查看所…

2024最新版聚合支付彩虹易支付PHP源码

彩虹易支付是一种便捷的支付解决方案&#xff0c;属于聚合易支付平台的一部分。它提供了即时到账功能&#xff0c;无需签约即可使用。通过这个平台&#xff0c;您可以方便地接入多种支付方式&#xff0c;包括支付宝当面付、QQ钱包、财付通、微信扫码支付和个体商户聚合收款码等…

内网渗透-DC-9靶机渗透

攻击机&#xff1a;kali 192.168.236.137 目标机&#xff1a;dc-9 192.168.236.138 一、信息收集 1.使用arp-scan -l和nmap进行主机发现和端口信息收集 nmap -sS -T5 --min-rate 10000 192.168.236.138 -sC -p- 发现22端口被阻塞 2.whatweb收集一下cms指纹信息 what http…

代码随想录算法训练营第62/63天| 503.下一个更大元素II、42. 接雨水、84.柱状图中最大的矩形

文章目录 503.下一个更大元素II思路代码 42. 接雨水思路代码 84.柱状图中最大的矩形思路代码 503.下一个更大元素II 题目链接&#xff1a;503.下一个更大元素II 文章讲解&#xff1a;代码随想录|503.下一个更大元素II 思路 和739. 每日温度 (opens new window)也几乎如出一辙&…

一周学会Django5 Python Web开发-Django5列表视图ListView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计27条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Matlab在同一张图中如何加入多个图例

根据代码最终画出的图片如下&#xff1a; 其实原理很简单&#xff0c;就是在一张figure中画多个坐标轴&#xff0c;每个坐标轴都有对应的图例&#xff0c;之后再将多余坐标轴隐藏&#xff0c;只保留一个即可。 代码如下&#xff1a; clear all; close all;dd_linewidth 1;a …

CSP-201712-1-最小差值

CSP-201712-1-最小差值 #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int>arr; int main() {int n, minDelta 99999;cin >> n;for (int i 0; i < n; i){int t;cin >> t;arr.push_back(t…

科技企业如何做到FTP数据安全保护

在数字化浪潮的推动下&#xff0c;科技企业的数据已成为推动创新、提升效率、增强竞争力的核心资源。数据的重要性不言而喻&#xff0c;它不仅包含了客户信息、市场分析、产品设计等关键信息&#xff0c;更是企业宝贵的资产。然而&#xff0c;随着数据量的激增&#xff0c;数据…

数据守护者:揭秘文件备份的重要性与实用策略

一、守护数据安全&#xff1a;文件备份的不可或缺性 在数字化时代&#xff0c;我们的工作、学习和生活都围绕着数据展开。无论是珍贵的家庭照片、重要的工作文件&#xff0c;还是个人的创意作品&#xff0c;这些数字资产都承载着我们的回忆、努力和创意。然而&#xff0c;随着…

基于扩散模型的图像编辑:首篇综述

AIGC 大模型最火热的任务之一——基于 Diffusion Model 的图像编辑(editing)领域的首篇综述。长达 26 页&#xff0c;涵盖 297 篇文献&#xff01;本文全面研究图像编辑前沿方法&#xff0c;并根据技术路线精炼地划分为 3 个大类、14 个子类&#xff0c;通过表格列明每个方法的…