1、题目
合并\ k k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
2、解题1
时间复杂度O(n*k)
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param lists ListNode类一维数组
* @return ListNode类
*/
func mergeKLists( lists []*ListNode ) *ListNode {
// write code here
if len(lists) == 0{
return nil
}
head := &ListNode{0,nil}
end := head
min,index := findMinListNode(lists)
for min != nil{
lists[index] = lists[index].Next
end.Next = min
end = end.Next
min,index = findMinListNode(lists)
}
return head.Next
}
func findMinListNode(lists []*ListNode)(*ListNode,int){
var min *ListNode = nil
index := 0
for i := 0;i<len(lists);i++{
if lists[i] != nil{
if min == nil{
min = lists[i]
index = i
}else if min.Val > lists[i].Val{
min = lists[i]
index = i
}
}
}
return min,index
}
3、解题2
两两合并,时间复杂度O(nlgk)
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param lists ListNode类一维数组
* @return ListNode类
*/
func mergeKLists( lists []*ListNode ) *ListNode {
// write code here
if len(lists) == 0{
return nil
}
for len(lists)>1{
tmp := mermergeList(lists[0],lists[1])
lists = append(lists, tmp)
lists = lists[2:]
}
return lists[0]
}
func mermergeList(first,second *ListNode)*ListNode{
head := &ListNode{0,nil}
end := head
for first != nil && second != nil{
if first.Val < second.Val{
end.Next = first
end = end.Next
first = first.Next
}else{
end.Next = second
end = end.Next
second = second.Next
}
}
if first != nil{
end.Next = first
}
if second != nil{
end.Next = second
}
return head.Next
}