23. Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list.Analyze and describe its complexity.
题意:
合并K个排序的链表并将其返回为一个排序列表,并分析其复杂性。
思路:
方法一:
直接利用暴力解决的办法,首先利用两个有序链表的合并算法21. Merge Two Sorted Lists,然后依次遍历k个有序链表,返回合并后的排序链表,但是时间复杂度极高,效率很低。
1 | //运行时间过高,You are here! Your runtime beats 3.58% of cppsubmissions. |
方法二:
利用堆排序的思想,将每个链表的表头元素取出来,建立一个小顶堆,因为k个链表中都排好序了,因此每次取堆顶的元素就是k个链表中的最小值,可以将其合并到合并链表中,再将这个元素的指针指向的下一个元素也加入到堆中,再调整堆,取出堆顶,合并链表。。。。以此类推,直到堆为空时,链表合并完毕。
建堆的时间复杂度是k/2logk, 每次取出堆顶再加入元素的复杂度是logk,假设每条链表平均有n个元素,则一共有nk-k次。因此总的时间复杂度为O(nklogk)。
1 | // 使用堆排序, |
Java Code:
1 | /** |
1 | //直接使用Java自带的优先队列PriorityQueue |