热门标签 | 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;
}

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


推荐阅读
  • 本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ... [详细]
  • Android 开发技巧:使用 AsyncTask 实现后台任务与 UI 交互
    本文详细介绍了如何在 Android 应用中利用 AsyncTask 来执行后台任务,并及时将任务进展反馈给用户界面,提高用户体验。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • D17:C#设计模式之十六观察者模式(Observer Pattern)【行为型】
    一、引言今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份& ... [详细]
  • 基于SSM框架的在线考试系统:随机组卷功能详解
    本文深入探讨了基于SSM(Spring, Spring MVC, MyBatis)框架构建的在线考试系统中,随机组卷功能的设计与实现方法。 ... [详细]
  • 本文详细介绍了 Redis 中的主要数据类型,包括 String、Hash、List、Set、ZSet、Geo 和 HyperLogLog,并提供了每种类型的基本操作命令和应用场景。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 本文详细介绍了如何在Spring框架中设置事件发布器、定义事件监听器及响应事件的具体步骤。通过实现ApplicationEventPublisherAware接口来创建事件发布器,利用ApplicationEvent类定义自定义事件,并通过ApplicationListener接口来处理这些事件。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
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社区 版权所有