LCR 023. 相交链表

一.题目:

LCR 023. 相交链表 - 力扣(LeetCode)

二.我的原始解法-无:

三.其他人的正确及好的解法,力扣解法参考:

哈希表法及双指针法:LCR 023. 相交链表 - 力扣(LeetCode)

B站动态讲解双指针处理相交链表过程:【史上最燃算法刷题】Leetcode160.相交链表_哔哩哔哩_bilibili

四.对于别人解法的消化及总结:

首先要稍微回顾下python实现链表的方法,题目中已经给出如下链表类型定义,初始化函数中有数值部分和指针部分,然后又给出了要实现

算法的函数入参,两个链表的头结点headA和headB

# Definition for singly-linked list.

# class ListNode:

#     def __init__(self, x):

#         self.val = x

#         self.next = None

def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:

【哈希表法】就是判断两个链表的指针地址相同,说明两个链表指向了同一个节点,这样就找到了交叉节点,但是要注意实现方法和列表查询的不同,

列表查询用index简单遍历或者内置函数操作即可,链表查询要注意指针问题。判断两个链表的指针相同,可以用哈希表法,就是把一个链表的已

遍历节点放到一个哈希表中,然后使用哈希表查找时间复杂度为O(1)的特点,直接用另一个链表的每个节点在哈希表中匹配,匹配一致的返回即可,

这种方法的时间复杂度为O(m+n),就是两个链表都要遍历一次,第一次生成哈希表,第二次查找哈希表,相当于用哈希表比对两个链表。有了这种解法,

自然会想到直接比较两个链表,不用哈希表做中间过渡,就是双指针法,先实现哈希表法如下:

【双指针法】

假设两个链表在相交节点之前的长度相同,那么只要两个指针分别指向两个链表开头,同时往后走,如果两个指针下一步走到了相同的节点,就找到了这两

链表的相交节点,这是基础思路。但是实际情况是两个链表在相交节点之前的长度可能一个长一个短,就像下图情况一所示,A链表和B链表相交于5,但是

A链表在5之前有4个节点,B链表在5之前有1个长度,长度不同没办法这样处理,所以要想办法在5之前构造两个链表长度相同的情况,所以就是让A链表走到

末尾后接上B的头部,B链表走到末尾后接上A的长度,这样两个链表在相交节点之前的长度就都是a+b+c了,而且相交链表的末尾部分又相同,走到末尾之前

又都走了a+b+c的距离,所以一定会在此之前有重叠部分。

否则就像情况二所示,虽然走了相同的长度,但是由于A和B不是相交链表,末尾不相同,所以也没有重叠部分,最终a+b+c的遍历后

两个指针都走到了对方链表的末尾

对于算法代码:

class Solution:

    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:

        # 双指针法

        x,y = headA,headB

        while x != y:

            x = x.next if x else headB

            y = y.next if y else headA

        return x

开始时两个指针分别指向两个链表头,每走一步判断指针是否相同,如果链表不为空就继续走,如果为空就使得next指向另一个链表,直到二者相同,

此时返回其中一个指针即可。

或者两个链表都走了a+b+c同时到达了末尾,next均为空,此时x=y,循环结束,返回空即可。

上面代码两种情况都可以跑通。

编程技巧:

1.python的哈希表是用字典代替的,这道题的哈希表解法也考察了python字典的初始化、赋值、查询,分别如下:

类似列表的创建方法:s={}

赋值:s[key]=value

查询:s.get(key)

2.遍历链表直接用while p: p=p.next即可,如果直接用头指针遍历,就用头指针替代p即可,如果链表节点数>=0,while循环执行次数>=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值