合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————————————————————————————————————————————————
根据2个链表合并的思路,对于多个链表合并,则找到所有链表的最小节点插入到新链表中,若是nil节点,则从数组中删掉
func mergeKLists(lists []*ListNode) *ListNode {
l := len(lists)
resHead := &ListNode{-1,nil}
if l == 0 {
return nil
}
p := resHead
for len(lists) > 0 {
min := &ListNode{99999,nil}
k := 0
l = len(lists)
for i:=0;i<l;i++ {
v := lists[i]
if v == nil {
//删除为nil的链表
lists = append(lists[:i],lists[i+1:]...)
//因为这一个节点原本为nil,对应的下标为i,删除它,需要将i-1
//这样在下一次循环时,i对应的正好是nil后面的一个元素
i--
//删除一个nil节点,长度减一
l--
} else {
if v.Val < min.Val {
min = v
k = i
}
}
}
if min.Val < 99999 {
p.Next = min
p = p.Next
//链表后移
if lists[k] != nil {
lists[k] = lists[k].Next
}
}
}
return resHead.Next
}