23、合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
方法一:两两合并
1.1 思路分析
这道题可以分解成两个两个合并,然后使用21、合并两个有序链表进行合并。获得一个合并好的链表,然后再用该链表与下一个链表进行合并。
1.2 代码实现
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
var pre, cur *ListNode
n := len(lists)
for i := 0; i < n; i++ {
if i == 0 {
pre = lists[i]
continue
}
cur = lists[i]
pre = merge2Lists(pre, cur)
}
return pre
}
func merge2Lists(l1 *ListNode, l2 *ListNode) *ListNode{
head := &ListNode{}
ptr := head
for l1!=nil && l2!=nil{
if l1.Val <= l2.Val{
ptr.Next = l1
l1 = l1.Next
}else{
ptr.Next = l2
l2 = l2.Next
}
ptr = ptr.Next
}
if l1 == nil{
ptr.Next = l2
}else if l2 == nil{
ptr.Next = l1
}
return head.Next
}
1.3 测试结果
1.4 复杂度
- 时间复杂度:假设每个链表的最长长度是 n。在第一次合并后,ans 的长度为 n;第二次合并后,ans 的长度为 2×n,第 i 次合并后,ans 的长度为i×n。第 i 次合并的时间代价是 O(n+(i−1)×n)=O(i×n),那么总的时间代价为
故渐进时间复杂度为 O(k2n)。 - 空间复杂度:没有用到与 k 和 n 规模相关的辅助空间,故渐进空间复杂度为 O(1)。