申明:本文只用做自己学习记录
题目
给定一个链表数组,每个链表都已经按升序排列。
请将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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
}