剑指Offer-52 两个链表的第一个公共节点(2020.7.30)

剑指Offer-52两个链表的第一个公共节点

题目可以看原题地址
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在这里插入图片描述
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
常规思路
(1)先固定一个节点如headA
(2)headB遍历一遍,虽然A得4和B得4值相同但是不是一个引用。B遍历完成之后,A走下一个,B在遍历一圈。直到A和B得节点重合
(3)这是一个双循环,时间复杂度为O(n^2)
思路
(1)根据链表得特性我们可以知道,如果两个链表有公共节点是不可能出现以下情况得,因为每个节点,只有一个next。
在这里插入图片描述
(2)要求时间复杂度为 O(N),空间复杂度为 O(1)。如果不存在交点则返回 null。

(3)设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。

(4)当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。

(5)如果不存在交点,那么 a + b = b + a,以下实现代码中 node1 和 node2 会同时为 null,从而退出循环。
(6)单次循环,复杂度为O(n)

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        node1, node2 = headA, headB
        
        while node1 != node2:
            node1 = node1.next if node1 else headB
            node2 = node2.next if node2 else headA

        return node1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值