目录

LC 1669. 合并两个链表 (opens new window) (opens new window)

中等

# 问题描述

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

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

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

图片1

请你返回结果链表的头指针。

示例 1:

示例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:

示例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

# 模拟

首先遍历一次 list2list2 找到其最后一个节点,然后开始遍历 list1list1,当到达下标 aa 是,将 aa 前一个节点的 nextnext 指针指向 list2list2 头部,然后从 aa 继续遍历,直到遍历到下标 bb,将 list2list2 最后一个节点的 nextnext 指针指向 bb 的下一节点即可。

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {number} a
 * @param {number} b
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeInBetween = function (list1, a, b, list2) {
  let list2_last = null
  let list2_cur = list2
  while (list2_cur) {
    list2_last = list2_cur
    list2_cur = list2_cur.next
  }
  let idx = 0
  let list1_cur = list1
  while (idx <= b) {
    if (idx === a - 1) {
      const next = list1_cur.next
      list1_cur.next = list2
      list1_cur = next
    } else if (idx === b) {
      const next = list1_cur.next
      list2_last.next = next
    } else {
      list1_cur = list1_cur.next
    }
    idx++
  }
  return list1
}
  • 时间复杂度:O(n+m)O(n + m)
  • 空间复杂度:O(1)O(1)
上次更新: 2023/01/31 19:48:05

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!