描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路
方法1: 两两合并
方法2: 分治合并
实现
func mergeKLists(lists []*ListNode) *ListNode {
if len(lists) == 0 {
return nil
} else if len(lists) == 1 {
return lists[0]
}
return mergeKListsBody(lists, 0, len(lists)-1)
}
func mergeKListsBody(lists []*ListNode, left, right int) *ListNode {
if left == right{
return lists[left]
}
mid := (left + right)/2
leftList := mergeKListsBody(lists, left, mid)
rightList := mergeKListsBody(lists, mid+1, right)
return mergeList(leftList, rightList)
}
func mergeList(list1 *ListNode, list2 *ListNode) *ListNode {
if list1 == nil {
return list2
} else if list2 == nil {
return list1
}
var head = new(ListNode)
var cur = head
for list1 != nil && list2 != nil {
if list1.Val < list2.Val {
cur.Next = list1
list1 = list1.Next
} else {
cur.Next = list2
list2 = list2.Next
}
cur = cur.Next
}
if list1 == nil {
cur.Next = list2
} else {
cur.Next = list1
}
return head.Next
}
func mergeKLists(lists []*ListNode) *ListNode {
if len(lists) == 0{
return nil
}else if len(lists) == 1{
return lists[0]
}
var ret = lists[0]
for i := 1; i < len(lists); i++{
ret = mergeList(ret, lists[i])
}
return ret
}
func mergeList(list1 *ListNode, list2 *ListNode)*ListNode{
if list1 == nil{
return list2
}else if list2 == nil{
return list1
}
var head = new(ListNode)
var cur = head
for list1 != nil && list2 != nil{
if list1.Val < list2.Val{
cur.Next = list1
list1 = list1.Next
}else{
cur.Next = list2
list2 = list2.Next
}
cur = cur.Next
}
if list1 == nil{
cur.Next = list2
}else{
cur.Next = list1
}
return head.Next
}