题目大意:
给出 n 个有序链表,合并为1个有序链表。
思路1:
优先队列。每次取n个链表的最小值,然后把取出节点的next节点加入队列。
思路2:
每次合并2个。时间复杂度不太会计算。
链表除了操作麻烦还是和数组不一样的,有自己的特性。这道题感觉出来了。
代码:
代码1:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
struct cmp {
bool operator() (ListNode* a, ListNode* b){
return a->val > b->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode ans(-1);
ListNode* cur = &ans;
priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
for (ListNode* list : lists) {
if (list) pq.push(list);
}
while(!pq.empty()) {
cur->next = pq.top();
pq.pop();
cur = cur->next;
//cout << "----\n";
if (cur->next) pq.push(cur->next);
}
return ans.next;
}
};
代码2:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge2Lists(ListNode* list1, ListNode* list2) {
ListNode ans(-1);
ListNode* cur = &ans;
while(list1 && list2) {
if (list1->val < list2->val) {
cur->next = list1;
list1 = list1->next;
}else {
cur->next = list2;
list2 = list2->next;
}
cur = cur->next;
}
cur->next = list1 ? list1 : list2;
return ans.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
int ed = lists.size();
while(ed > 1) {
for (int i=0; i<ed/2; ++i) {
lists[i] = merge2Lists(lists[i], lists[ed-1-i]);
}
ed = ed - ed/2;
}
return lists.empty() ? NULL : lists[0];
}
};
经历了暴躁的一周。今天终于好点了。
都可以的。尽力了就好。是不是走弯路不是你能决定的了。
首先,至少做到让自己觉得,我可以。