最近我把做过的题目 题解+思路+代码+代码注释 都放到了 github上,有需要的自取 github地址
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
一个有序的链表数组,将里面的所有值按照顺序重新排列成一个有序链表
nil
(此方法是一种思路,没写代码实现)发现第一种解法特别简单,然后几分钟就写出来了
var values []int
listLen := len(lists)
if listLen == 0 {
return nil
}
for i:=0;i<listLen;i++ {
ls := lists[i]
for ls != nil {
values = append(values,ls.Val)
ls = ls.Next
}
}
sort.Sort(sort.IntSlice(values))
newList := &ListNode{
}
head := newList
for k,v := range values {
head.Next = &ListNode{
Val:v,
}
if k == len(values) {
head.Next = nil
}
head = head.Next
}
return newList.Next
列一下解法四
func mergeKLists(lists []*ListNode) *ListNode {
if len(lists) == 1 {
return lists[0]
}
var list *ListNode
for i:=0;i<len(lists);i++ {
if i == 0 {
list = mergeTwoLists(lists[0],lists[1])
i++
continue
}
list = mergeTwoLists(list,lists[i])
}
return list
}
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
if l1 == nil {
return l2
}
if l2 == nil {
return l1
}
newNode := &ListNode{Val:0}
head := newNode
for l1 != nil && l2 != nil {
if l1.Val > l2.Val {
newNode.Next = l2
l2 = l2.Next
} else {
newNode.Next = l1
l1 = l1.Next
}
newNode = newNode.Next
}
if l1 != nil {
newNode.Next = l1
}
if l2 != nil {
newNode.Next = l2
}
return head.Next
}
本站(PHP --> Golang)已重构,代码开源
当你能力不能满足你的野心的时候,你就该沉下心来学习