[牛客网刷题 Day2] JZ52 两个链表的第一个公共结点(没做出来)双指针巧解

本文主要是介绍[牛客网刷题 Day2] JZ52 两个链表的第一个公共结点(没做出来)双指针巧解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:

在这里插入图片描述

思考过程:

好像想的太复杂了,首先固定phead1,寻找val一样的phead2,找到的话,就都往右移动一位;否则phead+1。可是需要注意好多好多的边界啊,写了好久好久,最后还是好几个用例通不过,只能根据用例慢慢改,可是怎么改都不对。o(╥﹏╥)o

class Solution:def FindFirstCommonNode(self , pHead1 , pHead2):# write code hereif pHead1==None or pHead2==None:return Nonedummy2 = pHead2while pHead1.next:while pHead1.val != pHead2.val:pHead2 = pHead2.next# 找完了都找不到相同值,l1+1,l2返回初始位置if pHead2 == None:pHead1 = pHead1.nextpHead2 = dummy2if pHead1 == None:return None# 找到相同值,都移动一位,dummy重新赋值else:dummy2 = pHead2if not(pHead1.next and pHead2.next):pHead2 = dummy2continuewhile pHead1.next or pHead2.next:if pHead1.next.val == pHead2.next.val:pHead1 = pHead1.nextpHead2 = pHead2.nextif pHead1.next == None and pHead2.next == None:return dummy2else:pHead1 = pHead1.nextif pHead1 == None:return pHead2.nextbreakelse: return dummy2return None

答案:

常规思路,跟我的思路差不多,但是他用到了哈希表。
啊啊啊,原来链表是可以比较的!可以使用in,可是我的编译器不能这样操作。。。
所以我是能做出这道题的呢!

啊啊啊啊啊啊,发现问题了!!我初始化链表的时候搞错了!应该创建三个链表,前两个再指向第三个呢!
在这里插入图片描述

常规思路就是用一个哈希集合来存储第一个链表遍历后的所有节点;接着遍历第二个链表,与哈希集合中的节点进行比较

如果第二个链表中节点不存在于哈希集合中,那么移动到下一个节点再比较
否则,节点存在于哈希集合中,返回第二个链表的该节点(他就是我们要找的第一个公共节点)。
PS:如果比较到最后一个节点发现,第二个链表中的节点都不存在于哈希集合中,那么说明这两个链表不相交!直接返回None即可。

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None#
# 
# @param pHead1 ListNode类 
# @param pHead2 ListNode类 
# @return ListNode类
#第一种解法:哈希
class Solution:def FindFirstCommonNode(self , pHead1 , pHead2 ):# write code here#首先判断两个链表是否为空if pHead1 is None or pHead2 is None:return None#定义链表1 的集合set_A = set()node1, node2 = pHead1, pHead2 #定义两个节点#遍历链表 1 ,把每个节点加入集合中while node1:set_A.add(node1)node1 = node1.next#遍历链表2 看当前节点是否在 集合中;如果存在,当前节点就是要找的第一个公共节点;否则继续比较下一个节点。#这里还要注意,如果遍历完链表 B,发现所有节点都不在集合中,则说明两个链表不相交,返回None。while node2:if node2 in set_A:return node2node2 = node2.nextreturn None

还有一个复杂的双指针思路,啊!
哇!太巧妙了吧!原理是:走一遍pHead1,再走一遍pHead2的总路程一定是相等的!

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
# @param pHead1 ListNode类 
# @param pHead2 ListNode类 
# @return ListNode类
#第二种解法:双指针
class Solution:def FindFirstCommonNode(self , pHead1 , pHead2 ):# write code here#首先判断两个链表是否为空if pHead1 is None or pHead2 is None:return None#使用双指针思路进行判断p1, p2 = pHead1, pHead2 #创建两个指针,分别指向两个链表的头节点#当指针指向的两个节点不相等:while p1 != p2:if p1:p1 = p1.next           #同时更新两个指针else:p1 = pHead2#直到p1走完了自己的节点,p2也走完了自己的节点,此时p1换到p2的这条道上;同理p2也走到p1的道上#两者还是每次都移动到下一个节点,最终p1会跟p2在某一个节点相遇,相遇的这个节点就是他们的公共节点!if p2:p2 = p2.nextelse:p2 = pHead1return p1                  #由于没有交点的时候,两个链表最后都会出现都是None值,所以此时返回的p1 = None          

这篇关于[牛客网刷题 Day2] JZ52 两个链表的第一个公共结点(没做出来)双指针巧解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时