Leetcode OJ 23 Merge k Sorted Lists [Hard]

xiaoxiao2021-02-28  57

Leetcode OJ 23 Merge k Sorted Lists [Hard]

题目描述:

     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的下一个节点;

 

转载请注明原文地址: https://www.6miu.com/read-59976.html

最新回复(0)