C语言强化(七)链表相交问题_1 判断无环链表相交

2023-11-10 10:10

本文主要是介绍C语言强化(七)链表相交问题_1 判断无环链表相交,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从此篇博文开始,讲解一道古老的链表相交问题,共五篇


题目

给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交


解题步骤

  1. 判断两个【无环】链表是否相交
  2. 找到两个【无环】链表的相交结点
  3. 判断链表是否带环
  4. 判断两个【有环】链表是否相交
  5. 找到两个【有环】链表的相交结点
此篇先从最简单的判断两个【无环】链表是否相交开始,顺便介绍一下链表的基础知识,方便一些对链表不太了解的同学学习。

基础知识

什么是链表?
链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
——From BaiKe
画个图展示一下链表

数据结构如下
struct ListNode{int data;ListNode * nextNode;ListNode(ListNode * node,int value){nextNode=node;data=value;}
};

有环链表?
只需修改一下指针的指向,就会发现,这个链表永远不会走到尽头,如下


如何判断两个链表是否相交?
思路:只要有一个节点相同,那么两链表就相交
方法一: 遍历遍历
遍历链表一,每次遍历到链表一的一个节点时判断是否和链表二的节点相同(方法同样是遍历),有相同的则说明两链表相交。
此方法当然可行,可是时间复杂度=O(length1*length2)

方法二:哈希表法 

既然连个链表一旦相交,相交节点一定有相同的内存地址,而不同的节点内存地址一定是不同的,那么不妨利用内存地址建立哈希表,如此通过判断两个链表中是否存在内存地址相同的节点判断两个链表是否相交。具体做法是:遍历第一个链表,并利用地址建立哈希表,遍历第二个链表,看看地址哈希值是否和第一个表中的节点地址值有相同即可判断两个链表是否相交。
时间复杂度O(length1 + length2)
空间复杂度O(length1)  因为需要创建大小为length1的哈希表

分析:时间复杂度是线性的,可以接受,并且可以顺便找到第一个相交节点,但是却增加了O(length1)的空间复杂度,这显然不能令人满意。——ref:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2580026.html


方法三:比较尾结点

只要两链表相交,那么相交后的那一段肯定是一样的,也就意味着尾结点是一样的

时间复杂度O(length1 + length2)

空间复杂度O(0)  


寻找尾结点的函数,很简单,就不解释了

/**
寻找尾结点
*/
ListNode * getLastNode(ListNode * head){if(head==NULL)return NULL;while(head->nextNode!=NULL){head=head->nextNode;}return head;
}


源代码

#include <stdio.h>
#include<stdlib.h>
#include <iostream>using namespace std;/**
1.判断两个【无环】链表是否相交
思路
判断尾节点是否相等
*//**
链表结构体
*/
struct ListNode{int data;ListNode * nextNode;ListNode(ListNode * node,int value){nextNode=node;data=value;}
};ListNode * L1;
ListNode * L2;//遍历链表
void ScanList(ListNode * node){while(NULL!=node){cout<<node->data<<endl;node = node->nextNode;}
}/**
寻找尾结点
*/
ListNode * getLastNode(ListNode * head){if(head==NULL)return NULL;while(head->nextNode!=NULL){head=head->nextNode;}return head;
}//测试无环相交
void testCross(){ListNode * node = new ListNode(NULL,0);node = new ListNode(node,1);node = new ListNode(node,2);L1 = new ListNode(node,11);L1 = new ListNode(L1,12);L1 = new ListNode(L1,13);L2 = new ListNode(node,21);L2 = new ListNode(L2,22);L2 = new ListNode(L2,23);
}//测试无环不相交
void testNotCross(){L1 = new ListNode(NULL,11);L1 = new ListNode(L1,12);L1 = new ListNode(L1,13);L2 = new ListNode(NULL,21);L2 = new ListNode(L2,22);L2 = new ListNode(L2,23);
}void main()
{testCross();//testNotCross();ListNode * node1 = getLastNode(L1);ListNode * node2 = getLastNode(L2);if(node1==node2)cout<<"相交"<<endl;elsecout<<"不相交"<<endl;system("pause");
}

既然知道两个【无环】链表相交,那么怎么找到相交结点,下一节,聊聊这个。







转载于:https://www.cnblogs.com/javdroider/p/5184295.html

这篇关于C语言强化(七)链表相交问题_1 判断无环链表相交的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381998

相关文章

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英