leetcode刷题笔记二十三 合并K个排序链表 Scala版本
leetcode刷题笔记二十三 合并K个排序链表 Scala版本
源地址:23. 合并K个排序链表
问题描述:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
代码补充:
//一般来说,最直接的方法是将所有链表进行合并,然后进行排序,显然这种
//做法效率低下且繁杂,采用优先队列的方法处理效率较高。
object Solution {
//引入scala的优先队列结构
import scala.collection.mutable.PriorityQueue
def mergeKLists(lists: Array[ListNode]): ListNode = {
//构建优先队列,ListNode类型的空优先队列
//根据节点的x值从小向大排列
val pq = PriorityQueue.empty[ListNode](Ordering.by(n => n.x)).reverse
//设置双头指针,便于返回
var head = new ListNode(0)
var nhead = head
//将Lists中各个链表加入优先队列
for (elem <- lists if (elem != null)) {println(elem);pq.enqueue(elem)}
//由于队列内有序,当PQ不为空时,弹出最小值链表头节点,如果其后还有结点,移动至后一个节点,再将队列入队,反复弹出当前队列中的最小的点,直到队列为空
while(pq.isEmpty != true){
var dnode = pq.dequeue()
head.next = new ListNode(dnode.x)
if(dnode.next != null) pq.enqueue(dnode.next)
head = head.next
}
nhead.next
}
}
知识补充:
关于优先队列的相关知识,主要参考于 https://www.cnblogs.com/wmyskxz/p/9301021.html 和 https://www.jianshu.com/p/b51ab28ca8dd。
优先队列
优先队列也是一种队列,不同的是 ,优先队列的出队顺序是按照优先级来的。根据优先级的不同,可具体分为:最大优先队列和最小优先队列。
最大优先队列:无论入队的顺序,当前最大的元素先出列。
最小优先队列:无论入队的顺序,当前最小的元素先出列。
使用二叉堆能够较为高效的实现有效队列
堆是一颗具有特定性质的二叉树,堆需要满足堆中所有节点的值必须大于等于或小于等于其孩子节点的值。二叉树除了满足堆的基本要求,每个节点最多由两个孩子节点。
堆调整与堆排序算法后续补充