合并K 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
思路:采用二分法,把list分成两半,最终会变成把K个链表两两合并,然后继续两两合并,最后合并在一起
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param lists ListNode类一维数组
* @return ListNode类
*/
func mergeKLists(lists []*ListNode) *ListNode {
if len(lists) == 0 {
return nil
}
return mergeKList(lists, 0, len(lists)-1)
}
func mergeKList(lists []*ListNode, left int, right int) *ListNode {
// write code here
if left == right {
return lists[left]
}
mid := (left + right) / 2
list1 := mergeKList(lists, left, mid)
list2 := mergeKList(lists, mid+1, right)
return mergeTwoList(list1, list2)
}
func mergeTwoList(list1 *ListNode, list2 *ListNode) *ListNode {
head := new(ListNode)
node := head
for list1 != nil && list2 != nil {
if list1.Val < list2.Val {
node.Next = list1
list1 = list1.Next
} else {
node.Next = list2
list2 = list2.Next
}
node = node.Next
}
if list1 != nil {
node.Next = list1
}
if list2 != nil {
node.Next = list2
}
return head.Next
}