您的位置:首页 > 其它

LeetCode: Merge k Sorted Lists

2014-10-01 23:53 183 查看
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity

1. Naive Solution

思路:直接的想法依次找出列表中的最小项串接起来。 复杂度分析:时间复杂度:O(k*n), 空间复杂度:O(c)。其中 n为最长子列表长度,c为常量。

ListNode *mergeKLists(vector<ListNode *>&lists) {
int n = (int) lists.size();
if (n == 0) return NULL;

ListNode *p = new ListNode(0);
ListNode *q = p;
int empty = 0;
int k;
while (empty < n) {
k = -1;
int i;
for (i = 0; i < n; ++i) {
if (lists[i]) {
k = i;
break;
}
}
for (int j = i + 1; j < n; ++j) {
if (lists[j] && (lists[j]->val) < (lists[i]->val)) {
k = j;
}
}

if (k == -1) break;

q->next = lists[k];
q  = q->next;
lists[k] = lists[k]->next;

if (!q->next) ++empty;
}

q = p->next;
delete p;
return q;

}


结果导致TLE,无法AC。

2. Advanced Solution

思路:使用Priority Queue。复杂度分析:时间复杂度O(lgk *n),空间复杂度O(k)。

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
class MergeCompareFunc {
public:
typedef ListNode * ListNodeP;
bool operator() (const ListNodeP & a, const ListNodeP & b) const {return (a->val > b->val);}
};
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
if (lists.size() < 1) {
return NULL;
}

priority_queue<ListNode*, vector<ListNode *>, MergeCompareFunc> pqueue;
for (ListNode *node : lists) {
if (node != NULL) {
pqueue.push(node);
}
}
ListNode *p = new ListNode(0);
ListNode *q = p;
while (pqueue.size() > 0) {
ListNode *n = pqueue.top();
pqueue.pop();
q->next = n;
q = q->next;
if (n->next) pqueue.push(n->next);
}

q = p->next;
delete  p;
return q;
}
};


可以AC。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: