0023.合并K个升序链表
方法一:分而治之
时间复杂度 $O(kn \times \log k)$,空间复杂度 $O(\log k)$,其中 $O(k)$ 表示链表的数目,$O(n)$ 表示平均链表长度。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
var merge func(left, right int) *ListNode
merge = func(left, right int) *ListNode {
if left > right {
return nil
}
if left == right {
return lists[left]
}
mid := (left + right) / 2
l := merge(left, mid)
r := merge(mid+1, right)
return mergeTwoLists(l, r)
}
return merge(0, len(lists)-1)
}
func mergeTwoLists(l1, l2 *ListNode) *ListNode {
dummy := &ListNode{}
p := dummy
for ; l1 != nil && l2 != nil; p = p.Next {
if l1.Val < l2.Val {
p.Next, l1 = l1, l1.Next
} else {
p.Next, l2 = l2, l2.Next
}
}
if l1 != nil {
p.Next = l1
} else {
p.Next = l2
}
return dummy.Next
}