- 题目 给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。
请你将 list1 中第 a 个节点到第 b 个节点删除,并将list2 接在被删除节点的位置。
输入:list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002] 输出:[0,1,2,1000000,1000001,1000002,5] 解释:我们删除 list1 中第三和第四个节点,并将 list2 接在该位置。上图中蓝色的边和节点为答案链表。
- 思路
- 找到 index 为 a 位置的节点 - preA。
- 找到 index 为 b + 1 位置的节点 - nextB。
- 找到 l2 的尾结点 - l2Tail。
- 将 preA 的 next 指向 list2;l2Tail 的 next 指向 nextB 即可。
- 代码
class Solution {
func mergeInBetween(_ list1: ListNode?, _ a: Int, _ b: Int, _ list2: ListNode?) -> ListNode? {
// step1
let preA = findPreA(list1, a)
// step2
let nextB = findNextB(list1, b)
// step3
let l2Tail = findL2Tail(list2)
// step4
preA?.next = list2
l2Tail?.next = nextB
return list1
}
func findPreA(_ list1: ListNode?, _ a: Int) -> ListNode? {
var cur = list1
var step = a - 1
while step > 0 {
cur = cur?.next
step -= 1
}
return cur
}
func findNextB(_ list1: ListNode?, _ b: Int) -> ListNode? {
var cur = list1
var step = b
while step > 0 {
cur = cur?.next
step -= 1
}
let result = cur?.next
cur?.next = nil
return result
}
func findL2Tail(_ list2: ListNode?) -> ListNode? {
var cur = list2
while cur?.next != nil {
cur = cur?.next
}
return cur
}
}