题目描述:
Merge k sorted linked lists and return it as one sortedlist. Analyze and describe its complexity.
public ListNodemergeKLists(List<ListNode> lists) {}
题目理解:
将k个排序链表合并为一个排序链表。
测试用例:
功能测试:输入含2个排序链表的列表;输入含3个排序链表的列表;
边界测试:输入含1个排序链表的列表;输入含0个排序链表的列表;
分析:
递归的方法:
1. 先思考如何实现合并两个排序链表:比较两个链表的头节点,更小的节点作为新的节点插入到合并的链表中;也可以用递归合并:
2. 利用合并两个排序链表的方法,合并k个排序链表:将k个链表分为左右两部分进行合并;每一部分又可以分为左右两部分合并,递归下去。
基于优先队列的方法:
3. 定义一个优先队列(传入比较器comparator),优先队列的长度是列表中包含的链表个数;优先队列的队首元素是权值最小的元素,用poll()方法获取并删除队首元素,弹出队列中权值最小的元素,当方法失败时返回null,而remove()当失败时抛出异常;
4. 定义一个虚假的头节点dummy,该头节点的next是合并后新链的头节点;维护一个指针tail表示新链的尾节点;初始tail指向虚假头节点dummy;
5. 将列表中的节点依次加入到优先队列中;
6. 当优先队列不为空时循环:优先队列弹出最小元素,赋值给tail的下一个节点;tail后移;如果现在的tail(刚才选择插入的最小元素)的下一个元素不为空,则将其加入到优先队列中;(也就是每次弹出优先队列中的最小值,弹出一个就将弹出节点的下一个节点加入优先队列,从而保证弹出顺序是从小到大)
7. 直到优先队列为空时,返回虚假节点dummy的下一个节点;