Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
solution: 第一种方法是打算先两两排序,再递归两两排序合并直到只有一个list。时间复杂度为nlog(k),但是曝出内存不够,所以该方法没通过。
(后来发现方法一没通过是因为在merge 2list的时候没有删除预定的头结点,当时写的时候图省事没想到会超出内存,这个在merge2list的时候即17题中也没改正过来,特此标注,下次需注意。)
第二种方法是维护一个小顶堆,然后每次传最大堆的根为目标结点。这个还没有实现,小顶堆懒得实现...lol
方法一如下,
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *merge(ListNode *l1, ListNode *l2)
{
ListNode *newHead = new ListNode(0);
ListNode *node = newHead;
ListNode *n1 = l1;
ListNode *n2 = l2;
while(n1 != NULL && n2 != NULL)
{
if(n1->val < n2 -> val)
{
node -> next = n1;
node = n1;
n1 = n1 -> next;
node -> next = NULL;
}
else
{
node -> next = n2;
node = n2;
n2 = n2 -> next;
node -> next = NULL;
}
}
while(n1 != NULL)
{
node -> next = n1;
node = n1;
n1 = n1 -> next;
node -> next = NULL;
}
while(n2 != NULL)
{
node -> next = n2;
node = n2;
n2 = n2 -> next;
node -> next = NULL;
}
ListNode *temp = newHead;
newHead = newHead -> next;
delete temp;
return newHead;
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(lists.size() == 0)
return NULL;
int n1 = lists.size();
while (n1 > 1)
{
int half = (n1+1) / 2;
for(int i = 0; (i < half) && (i + half < n1); i++)
{
ListNode *node1 = lists[ i ];
ListNode *node2 = lists[ i+half ];
lists[i] = merge(node1, node2);
}
n1 = half;
}
return lists[0];
}
};

本文探讨了如何高效地将多个已排序的链表合并为一个有序链表,介绍了两种方法:一种是两两排序合并,但因内存溢出而未通过;另一种是维护小顶堆的方法,但作者暂时未实现。重点分析了合并过程中的内存管理问题,并提出了优化策略。
234

被折叠的 条评论
为什么被折叠?



