链表-中等:合并两个链表 By Swift

  • 题目

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

请你将 list1 中第 a 个节点到第 b 个节点删除,并将list2 接在被删除节点的位置。spa

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

  • 思路
    • 找到 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
    }
}
复制代码
相关文章
相关标签/搜索