LC 1669. 合并两个链表 (opens new window) (opens new window)
中等
# 问题描述
给你两个链表 list1
和 list2
,它们包含的元素分别为 n
个和 m
个。
请你将 list1
中下标从 a
到 b
的全部节点都删除,并将 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
# 模拟
首先遍历一次 找到其最后一个节点,然后开始遍历 ,当到达下标 是,将 前一个节点的 指针指向 头部,然后从 继续遍历,直到遍历到下标 ,将 最后一个节点的 指针指向 的下一节点即可。
/**
* 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
}
- 时间复杂度:
- 空间复杂度:
上次更新: 2023/01/31 19:48:05
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!