014_合并K个排序链表
知识点:递归、分治、优先队列(堆)
LeetCode第二十三题:https://leetcode-cn.com/problems/merge-k-sorted-lists/submissions/
分治与优先队列都能实现logk的效果,这里只实现了分治的解法,没有用优先队列(Go中搞到优先队列数据结构有点麻烦,还是Java和Python友好)。
语言:GoLang
// 朴素解法:递归
func mergeKLists_(lists []*ListNode) *ListNode {
tmpMin, tmpIndex := math.MaxInt32, -1
for i := 0; i < len(lists); i++ {
if lists[i] == nil {
continue
}
if lists[i].Val < tmpMin {
tmpMin = lists[i].Val
tmpIndex = i
}
}
if tmpIndex == -1 {
return nil
}
head := lists[tmpIndex]
lists[tmpIndex] = lists[tmpIndex].Next
head.Next = mergeKLists(lists)
return head
}
// 分治
func mergeKLists(lists []*ListNode) *ListNode {
length := len(lists)
if length == 0 {
return nil
}
if length == 1 {
return lists[0]
}
return mergeTwoLists(mergeKLists(lists[ : length / 2]), mergeKLists(lists[length / 2 : ]))
}
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
if l1.Val > l2.Val {
l2.Next = mergeTwoLists(l1, l2.Next)
return l2
}else {
l1.Next = mergeTwoLists(l1.Next, l2)
return l1
}
}