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

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

一、介绍

链表相交:

若两个链表相交,则两个链表有共同的节点,那从这个节点之后,后面的节点都会重叠,知道链表结束。若相交,则两个链表呈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.rhkb.cn/news/267714.html

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

相关文章

灯塔:CSS笔记

CSS&#xff1a;层叠样式表 所谓层叠 即叠加的意思&#xff0c;表示样式可以一层一层的层叠覆盖 css写在style标签中&#xff0c;style标签一般写在head标签里面&#xff0c;title标签下面 <!DOCTYPE html> <html lang"en"> <head><meta cha…

Vue开发实例(一)Vue环境搭建第一个项目

Vue环境搭建&第一个项目 一、环境搭建二、安装Vue脚手架三、创建Vue项目 一、环境搭建 下载方式从官网下载&#xff1a;http://nodejs.cn/download/ 建议下载v12.16.0版本以上的&#xff0c;因为版本低无法创建Vue的脚手架 检验是否安装成功 配置环境变量 新增NODE_HOME&…

chrome选项页面options page配置

options 页面用以定制Chrome浏览器扩展程序的运行参数。 通过Chrome 浏览器的“工具 ->更多工具->扩展程序”&#xff0c;打开chrome://extensions页面&#xff0c;可以看到有的Google Chrome扩展程序有“选项Options”链接&#xff0c;如下图所示。单击“选项Options”…

车载测试_UDS诊断:功能寻址、物理寻址

车载项目讲解 简历修改优化 模拟面试 面试录音辅导 预约面试技巧 面试一对一在线协助 车载入职技术支持三个月 诊断三要素&#xff1a;请求/肯定响应/否定响应&#xff08;诊断服务失败或者无法完成&#xff09;。 服务可以诊断通信管理请求、数据请求、故障代码请求、输入/输出…

SpringBoot约定大于配置

什么是约定大于配置 "约定大于配置"&#xff08;Convention Over Configuration&#xff09;是一种理念&#xff0c;旨在通过默认约定和规则来减少开发人员需要做的配置工作。在Spring Boot框架中&#xff0c;这一原则得到了充分应用&#xff0c;帮助开发者更快地构…

使用Spark探索数据

需求分析 使用Spark来探索数据是一种高效处理大规模数据的方法&#xff0c;需要对数据进行加载、清洗和转换&#xff0c;选择合适的Spark组件进行数据处理和分析。需求分析包括确定数据分析的目的和问题、选择合适的Spark应用程序和算法、优化数据处理流程和性能、可视化和解释…

(三)softmax分类--九五小庞

softmax分类 对数几率回归解决的是二分类的问题&#xff0c;对于多个选项的问题&#xff0c;我们可以使用softmax函数&#xff0c;它是对数几率回归在N个可能不同的值上的推广 softmax各样本分量之和为1&#xff0c;当只有两个类别时&#xff0c;与对数几率回归完全相同 损失…

vmware虚拟机centos中/dev/cl_server8/root 空间不够

在使用vmware时发现自己的虚拟机的/dev/cl_server8/root空间不够了&#xff0c;没办法安装新的服务。所以查了一下改空间的办法。 1.在虚拟机关闭的状态下&#xff0c;选中需要扩容的虚拟机->设置->硬件-> 硬盘->扩展->填写扩大到的值。 2.打开虚拟机&#xff…

CSS 盒子模型(box model)

概念 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"这一术语是用来设计和布局时使用CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素&#xff0c;它包括&#xff1a;外边距(margin)&#xff0c;边框(border)&#xff0c;内边距(pad…

ELK+kafka+filebeat企业内部日志分析系统

目录 ELKkafkafilebeat企业内部日志分析系统 1、组件介绍 1、Elasticsearch&#xff1a; 2、Logstash: 3、Kibana: 4、Kafka&#xff1a; 5、Filebeat: 2、环境介绍 3、版本说明 4、搭建架构 5、实施部署 1、 Elasticsearch集群部署 1、安装配置jdk 2、安装配置ES…

2024 年适用于电脑的十大录制屏幕软件

录制屏幕软件的设计和开发旨在让您的工作流程更轻松、更高效。这些漂亮的工具有助于为教育目的捕获图像快照或记录屏幕以与客户共享模型。无论您寻找桌面屏幕录像机的原因是什么&#xff0c;这里都有最好的付费和免费实用程序。该类别中我们最喜欢的一些选择是 奇客录屏助手和 …

基于Springboot的人事管理系统 (有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的人事管理系统 &#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&am…

【机器学习】FashionMNIST数据集简介及下载方法(自动下载)

【机器学习】FashionMNIST数据集简介及下载方法(自动下载) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订…

MATLAB环境下基于图像处理的计算病理学图像分割(MATLAB R2021B)

人工智能是病理学诊断和研究的重要新兴方法&#xff0c;其不仅可用于病理形态数据分析&#xff0c;还可整合免疫组化、分子检测数据和临床信息&#xff0c;得出综合的病理诊断报告&#xff0c;为患者提供预后信息和精准的药物治疗指导。计算病理学是病理学与AI、计算机视觉等信…

【LeetCode:2368. 受限条件下可到达节点的数目 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Java面试——Redis

优质博文&#xff1a;IT-BLOG-CN 一、Redis 为什么那么快 【1】完全基于内存&#xff0c;绝大部分请求是纯粹的内存操作&#xff0c;非常快速。数据存在内存中。 【2】数据结构简单&#xff0c;对数据操作也简单&#xff0c;Redis中的数据结构是专门进行设计的。 【3】采用单线…

(C语言)回调函数

回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#xff0c;被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅…

python 基础知识点(蓝桥杯python科目个人复习计划56)

今日复习内容&#xff1a;做题 例题1&#xff1a;最小的或运算 问题描述&#xff1a;给定整数a,b&#xff0c;求最小的整数x&#xff0c;满足a|x b|x&#xff0c;其中|表示或运算。 输入格式&#xff1a; 第一行包括两个正整数a&#xff0c;b&#xff1b; 输出格式&#…

【【C语言简单小题学习-1】】

实现九九乘法表 // 输出乘法口诀表 int main() {int i 0;int j 0;for (i 1; i < 9; i){for (j 1; j < i;j)printf("%d*%d%d ", i , j, i*j);printf("\n"); }return 0; }猜数字的游戏设计 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdi…

一周学会Django5 Python Web开发-Django5详细视图DetailView

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