go语言刷题:23. 合并K个升序链表

申明:本文只用做自己学习记录

题目

给定一个链表数组,每个链表都已经按升序排列。

请将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:

输入:lists = []
输出:[]
示例 3:

输入:lists = [[]]
输出:[]

代码

type ListNode struct {
	Val  int
	Next *ListNode
}

//方法1:先取出节点中的数值,然后进行排序,最后创建新节点并赋值
func mergeKLists(lists []*ListNode) *ListNode {
	//初始化整数数组
	nums := []int{}
	//遍历节点数
	for _, value := range lists {
		for value != nil {
			nums = append(nums, value.Val)
			value = value.Next
		}
	}

	//排序
	for i := 0; i < len(nums); i++ {
		for j := 0; j < len(nums)-1-i; j++ {
			if nums[j] > nums[j+1] {
				nums[j], nums[j+1] = nums[j+1], nums[j]
			}
		}
	}
	//重新赋值给节点
	dummy := &ListNode{0, nil}
	index := dummy
	for i := 0; i < len(nums); i++ {
		temp := &ListNode{nums[i], nil}
		index.Next = temp
		index = index.Next
	}
	return dummy.Next
}

//方法2:递归,两两进行比较融合
func mergeKLists(lists []*ListNode) *ListNode {
	return mergeSort(lists)
}

func mergeSort(lists []*ListNode) *ListNode {
	if len(lists) == 0 {
		return nil
	}
	if len(lists) == 1 {
		return lists[0]
	}
	mid := len(lists) / 2
	l, r := mergeSort(lists[:mid]), mergeSort(lists[mid:])
	dummy := &ListNode{}
	cur := dummy
	for l != nil && r != nil {
		if l.Val < r.Val {
			cur.Next = &ListNode{Val: l.Val}
			l = l.Next
		} else {
			cur.Next = &ListNode{Val: r.Val}
			r = r.Next
		}
		cur = cur.Next
	}
	for l != nil {
		cur.Next = &ListNode{Val: l.Val}
		l = l.Next
		cur = cur.Next
	}
	for r != nil {
		cur.Next = &ListNode{Val: r.Val}
		r = r.Next
		cur = cur.Next
	}
	return dummy.Next
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值