题目描述:具体描述原题。简单来说就是将N个有序链表合并成为一个有序链表。
解题思路:最暴力的方法是遍历N个链表,每次合并两个链表。稍微思考一下发现该题很适合直接套用分治思想来解,为了节省空间,两两合并有序链表过程中可以采用递归。具体过程见代码注释。
具体代码:
func mergeKLists(lists []*ListNode) *ListNode { // 套用分治基础解题模型即可
l := len(lists)
if l == 0 { // 划分结束条件
return nil
}
if l == 1 { // 划分结束条件
return lists[0]
}
n := l / 2 // 划分空间,将问题分解为两个子问题
left := mergeKLists(lists[:n]) // 递归解决第一个子问题
right := mergeKLists(lists[n:]) // 递归解决第二个子问题
return merge(left, right) // 将两个有序链表合并成为一个有序链表
}
func merge(l1, l2 *ListNode) *ListNode { // 合并两个有序链表,该方法可作为21题解题思路
if l1 == nil { // 递归终止条件
return l2
}
if l2 == nil { // 递归终止条件
return l1
}
if l1.Val < l2.Val { // 合并升序链表,合并降序链表时只需改变判断条件
l1.Next = merge(l1.Next, l2)
return l1
}
l2.Next = merge(l1, l2.Next)
return l2
}
补充说明:分治只是一种思路,该题存在多种解题思路,欢迎留言