2.2每日一题

给定两个链表list1和list2,以及链表list1中的下标a和b,删除list1中下标从a到b的所有节点,然后将list2插入到被删除节点的位置。解题方法是找到list1中下标a-1的节点和b+1的节点,然后将list2连接在这两个节点之间,返回结果链表的头指针。
摘要由CSDN通过智能技术生成

题目描述

题目链接:1669.合并两个链表

给你两个链表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]
解释:上图中蓝色的边和节点为答案链表。

提示

  • 3 <=list1.length<= 104
  • 1 <=a<=b<list1.length - 1
  • 1 <=list2.length<= 104

解题核心

注意是根据下标去删除[a,b]节点,而不是根据节点值去删除,我们找到第a-1个节点第b+1个节点,然后用list2连接即可,因为返回头指针,所以需要备份

解法一:模拟

直接设置两个指针去寻找第a-1个节点第b+1个节点,然后拼接即可
为什么是找第a-1个节点第b+1个节点是因为我们要修改链表的指向,而不是修改链表本身的地址,如果我们直接将第a个节点换成list2,那么第a-1个节点指向的还是第a个节点,相当于没有修改原链表

public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
    ListNode aNode = list1;//记录list1在a-1点的指针
    ListNode bNode = list1;//记录list1在b+1点的指针
    for (int i = 0; i < a - 1; i++) {
        aNode = aNode.next;//此时已经指向a-1点
    }
    for (int i = 0; i < b + 1; i++) {
        bNode = bNode.next;//此时已经指向b+1点
    }
    aNode.next = list2;
    while (aNode.next != null) {
        aNode = aNode.next;
    }
    aNode.next = bNode;
    return list1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

伊天凌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值