合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入: [1->4->5,1->3->4,2->6]
输出: 1->1->2->3->4->4->5->6
思路分析:
要将k个链表合并成一个有序链表,直接一点思考那就是每次都看k个链表的头部节点谁最小,就把最小的节点加入结果中。
当然,把最小的点加入后,指针需向后移动,将下一个节点和剩下k-1个节点继续比较。
这样每次都要从k个元素中找最小的值,最小堆正好完美契合我们的需求。
用(node.val, node)作为堆中的元素,这样就可以按照node.val进行排序了,堆顶元素保证是值最小的节点。
1 | # 108ms, beats 42.63% |
既然题目让我们分析一下复杂度,那我们就来看一下,对于每个结点,都只进行了一次进堆和出堆操作。所以时间复杂度为O(num)
,num表示k个链表中所有节点的数量.