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

相关文章

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁