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

相关文章

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1