合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
答案:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
if len(lists) == 0 {
return nil
}
length := len(lists)
if length == 1 {
return lists[0]
} else if length == 2 {
return mergeTwoLists(lists[0], lists[1])
} else {
node1 := mergeKLists(lists[:length/2])
node2 := mergeKLists(lists[length/2:])
return mergeTwoLists(node1, node2)
}
}
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
var result *ListNode
if l1.Val >= l2.Val {
result = l2
result.Next = mergeTwoLists(l1, l2.Next)
} else {
result = l1
result.Next = mergeTwoLists(l1.Next, l2)
}
return result
}