题解 | #合并k个已排序的链表#
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param lists ListNode类一维数组
* @return ListNode类
*/
/*
采用递归的方法合并; -> 先合并两个 -> 递归迭代; -> 如果一个个递归迭代,时间复杂度是O(n^2)
-> 采用并归排序;关键词:分治法
->要做到O(nlogn)的时间复杂度? -> 采用并归排序
//分治法:https://www.cnblogs.com/chengxiao/p/6194356.html;
//https://cloud.baidu.com/article/3067219;最坏情况是O(n^2)
*/
func mergeKLists(lists []*ListNode) *ListNode {
// write code here
if len(lists) == 0 {
return nil
}
if len(lists) == 1 {
return lists[0]
}
if len(lists) == 2 {
return merge2Lists(lists[0], lists[1])
}
mid := len(lists) / 2
l1 := mergeKLists(lists[:mid])
l2 := mergeKLists(lists[mid:])
return merge2Lists(l1, l2)
}
func merge2Lists(l1, l2 *ListNode) *ListNode {
dummy := &ListNode{}
res := dummy
for l1 != nil && l2 != nil {
if l1.Val < l2.Val {
dummy.Next = l1
l1 = l1.Next
} else {
dummy.Next = l2
l2 = l2.Next
}
dummy = dummy.Next
}
if l1 == nil {
dummy.Next = l2
}
if l2 == nil {
dummy.Next = l1
}
return res.Next
}
//关键词:O(nlogn) -> 快排序;并归排序;分治法;递归;
