题解 | #合并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) -> 快排序;并归排序;分治法;递归;

全部评论

相关推荐

美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
猪扒已出闸:方向不够聚焦,看不出来是想找什么方向的工作
点赞 评论 收藏
分享
与火:这不接? 留子的钱不挣白不挣
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务