算法刷题打卡第75天:合并两个链表

合并两个链表

难度:中等

给你两个链表 list1list2 ,它们包含的元素分别为 n 个和 m 个。

请你将 list1 中下标从 ab 的全部节点都删除,并将 list2 接在被删除节点的位置。

下图中蓝色边和节点展示了操作后的结果:

请添加图片描述
请你返回结果链表的头指针。

示例 1:

请添加图片描述

输入:list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]
输出:[0,1,2,1000000,1000001,1000002,5]
解释:我们删除 list1 中下标为 3 和 4 的两个节点,并将 list2 接在该位置。上图中蓝色的边和节点为答案链表。

示例 2:

请添加图片描述

输入:list1 = [0,1,2,3,4,5,6], a = 2, b = 5, list2 = [1000000,1000001,1000002,1000003,1000004]
输出:[0,1,1000000,1000001,1000002,1000003,1000004,6]
解释:上图中蓝色的边和节点为答案链表。

模拟

思路:
题目要求将 list 1 \textit{list}_1 list1 的第 a a a b b b 个节点都删除,将其替换为 list 2 \textit{list}_2 list2。因此,我们首先找到 list 1 \textit{list}_1 list1 中第 a − 1 a - 1 a1 个节点,以及第 b + 1 b + 1 b+1 个节点。由于 1 ≤ a ≤ b < n − 1 1 \le a \le b \lt n - 1 1ab<n1(其中 n n n list 1 \textit{list}_1 list1 的长度),所以 a − 1 a-1 a1 个节点和 b + 1 b+1 b+1 个节点是一点存在的。

然后我们让第 a − 1 a-1 a1 个节点的 next \textit{next} next 指向 list 2 \textit{list}_2 list2 的头节点,再让 l i s t 2 list2 list2 的尾节点的 next \textit{next} next 指向第 b + 1 b+1 b+1 个节点即可。

复杂度分析:

  • 时间复杂度: O ( n + m ) O(n + m) O(n+m),其中 n n n list 1 \textit{list}_1 list1 的长度, m m m list 2 \textit{list}_2 list2 的长度。
  • 空间复杂度: O ( 1 ) O(1) O(1)
class Solution:
    def mergeInBetween(self, list1: ListNode, a: int, b: int, list2: ListNode) -> ListNode:
        list3 = list1
        for i in range(a - 1):
            list1 = list1.next
        list4 = list1
        for i in range(b - a + 2):
            list4 = list4.next
        list1.next = list2 
        while list2.next:
            list2 = list2.next
        list2.next = list4
        return list3

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-in-between-linked-lists

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值