热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手把手教你学会简单的链表相交问题(LeetCode160.相交链表)

目录前言一,题目分析1.1题目分析1.2多种思路二,思路分析2.1判断链表是否相交2.2找出第一个相交的节点第一步:是否相交

目录

前言

一,题目分析

1.1题目分析

1.2多种思路

二,思路分析

2.1判断链表是否相交

2.2找出第一个相交的节点

第一步:是否相交

第二步:比较前的准备

第三步:比较

三,原码实现 




前言

Hello,小伙伴们大家好啊,是的,你没有看错,今天依旧是链表的题目:力扣上第160题,相交链表。那么我们呢废话不多说,进入正题。


一,题目分析


1.1题目分析

那么如下图所示:


要求一:题目中要求我们找出两个链表第一次相交的节点,如果两个链表不相交的话,返回 NULL 即可。

要求二:题目中表明不会存在环,同时在我们返回最后的结果时,我们不能改变原先两个链表的结构。


也就是说,我们不能通过改变原链表,这样就使得我们想通过改变链表结构来实现判别,是不可能的了。


1.2多种思路


但是这里最简单的方法,就是将每个链表的节点值分别复制在两个数组中,然后比较两个数组的大小。这样做虽然思路比较简单。


但这里我们不通过这样的方式实现,既然是链表,那我们就通过链表的方式实现。虽然在实现上有一定的难度,但是这对于我们理解链表的功能是非常有用的。

接下来我们一起看看吧!


二,思路分析

那么经过以上分析之后,我们接下来用链表的思路实现一下。


2.1判断链表是否相交

首先,我们考虑到的是,如果两个链表有相交的话,那么两链表的最后一个节点是相同的,所以我们可以通过两个链表最后的节点是否相同来判断两个链表是否有相交。代码实现附上:

while(nA->next){++lenA;nA=nA->next;}while(nB->next){++lenB;nB=nB->next;}if(nA!=nB){return NULL;}

2.2找出第一个相交的节点


第一步:是否相交


那么经过以上步骤,如果有相交的节点的话,那么我们需要找出相交的第一个节点。那么我们的思路就是两个链表的节点依次比较,如果发现某个节点处,两个俩表是相等的,此时,就是第一个相交的节点。



第二步:比较前的准备

但是注意,如果两个链表的长度不一样的话,那么是找不到相交节点的。如下图所示:

如上图所示,链表 A 和 链表 B 的长度是不一样的,而且这两个链表有三个节点是相交的,如果我们直接比较的话,当指针 curA 和 curB 一起移动的时候,两链表直到出了比较的循环,依旧还是找不到的相交的节点的。


所以,这里我们需要使两个链表从长度一致的时候,再一起移动。这样就一定会找到那个第一次相交的元素。


所以,这里首先较长的那个链表 “先走差距步”,保证两个链表长度相等了之后,再移动。 

int len=abs(lenA-lenB);struct ListNode*longList=headA;struct ListNode*shortList=headB;if(lenB>lenA){longList=headB;shortList=headA;}while(len--){longList=longList->next;}

第三步:比较

当我们通过以上步骤之后,此时我们就可以找第一次相交的节点了。相对比较简单,我们就不过多赘述了。直接上代码:

while(longList!=shortList){longList=longList->next;shortList=shortList->next;}return longList;

最后只需要将该节点返回即可。


三,原码实现 

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {// struct ListNode*curA=headA;// struct ListNode*curB=headB;struct ListNode*nA=headA;struct ListNode*nB=headB;int lenA=0,lenB=0;//这里不应该将判断条件设为nA和nB,因为虽然判断到最后一个节点,//但是下一步nA和nB都指向哪了不知道while(nA->next){++lenA;nA=nA->next;}while(nB->next){++lenB;nB=nB->next;}if(nA!=nB){return NULL;}int len=abs(lenA-lenB);struct ListNode*longList=headA;struct ListNode*shortList=headB;if(lenB>lenA){longList=headB;shortList=headA;}while(len--){longList=longList->next;}while(longList!=shortList){longList=longList->next;shortList=shortList->next;}return longList;
}

好的,那么对于链表相交的解析就到这里啦。如有问题,还请指正呀!


推荐阅读
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • 本文详细介绍了 com.facebook.drawee.view.SimpleDraweeView 中的 setScaleType 方法,提供了多个实际代码示例,并解释了其在不同场景下的应用。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 本文提供了使用Java实现Bellman-Ford算法解决POJ 3259问题的代码示例,详细解释了如何通过该算法检测负权环来判断时间旅行的可能性。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 数据结构入门:栈的基本概念与操作
    本文详细介绍了栈这一重要的数据结构,包括其基本概念、顺序存储结构、栈的基本操作(如入栈、出栈、清空栈和销毁栈),以及如何利用栈实现二进制到十进制的转换。通过具体代码示例,帮助读者更好地理解和应用栈的相关知识。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有