面试提合并K个排序链表快手

解题报告:

方法一

在合并两个有序链表的基础上,很容易想到这种解法,我们先将第一个链表和第二个链表合并成一个新的链表,然后依次合并接下来的每个链表。

假设每个链表节点node数一样都为n,第一次合并时,要遍历2n个结点,往后则要分别遍历3n,4n,……,kn个节点Node。可以看到,每次进行合并时都要将之前所有的链表遍历一次,因此这个方法的时间复杂度较高,为O(mn)。

方法二

如果每次只合并相邻的两个链表,这样经过第一轮合并后,链表个数减半,重复该过程,直至剩余一个链表。假设每个链表节点Node数一样都为n,第一轮合并时,要进行m/2次合并,每次合并要遍历2n个结点;第二轮合并时,要进行m/2/2次合并,每次合并要遍历4n个结点;可见,每次合并过程都只需要遍历mn次结点。而总共要进行个循环log_2(m),因此这个方法的时间复杂度为n*m*log_2(m)。方法三

利用C++模板库中的优先队列构建小顶堆,每次首结点元素值最小的链表出队,然后将首结点插入到新链表后面,再把删除首结点后的子链表放入队列中继续比较,直到队列为空结束。

以上三种思路,基本能搞定面试需要.




转载请注明:http://www.aierlanlan.com/grrz/4186.html