解题思路:思路很简单。因为vector容器支持不停的取出和放回操作。所以可以每次取出两个链表,合并好之后再放回。当然,前提是vector中的元素数目多于1。元素数目等于一时即为所求的链表。不过这题的坑点是vector的访问与删除操作,见下面四种解法。
方法一:
Runtime: 243 ms
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())
return NULL;
while(lists.size()!=1){
ListNode *pa = lists.back();
lists.pop_back();
ListNode *pb = lists.back();
lists.pop_back();
ListNode *dummy = new ListNode(0);
ListNode *cur = dummy;
while(pa && pb){
if(pa->val<pb->val){
cur->next = pa;
cur = cur->next;
pa = pa->next;
}else{
cur->next = pb;
cur = cur->next;
pb = pb->next;
}
}
if(pa)
cur->next = pa;
else if(pb)
cur->next = pb;
else
cur->next = NULL;
ListNode *head = dummy->next;
lists.push_back(head);
delete dummy;
}
return lists.back();
}
方法二:
Runtime: 359 ms
class Solution {
public:
ListNode* merge2Lists(ListNode *l1,ListNode *l2){
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
if(l1->val < l2->val){
l1->next = merge2Lists(l1->next,l2);
return l1;
}else{
l2->next = merge2Lists(l2->next,l1);
return l2;
}
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())
return NULL;
while(lists.size()>1){
ListNode *pa = lists.back();
lists.pop_back();
ListNode *pb = lists.back();
lists.pop_back();
ListNode *head = merge2Lists(pa,pb);
lists.push_back(head);
}
return lists.back();
}
};
方法三:
Runtime: 66 ms
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.empty())
return NULL;
while(lists.size()!=1){
ListNode *pa = lists[0];
ListNode *pb = lists[1];
ListNode *dummy = new ListNode(0);
ListNode *cur = dummy;
while(pa && pb){
if(pa->val<pb->val){
cur->next = pa;
cur = cur->next;
pa = pa->next;
}else{
cur->next = pb;
cur = cur->next;
pb = pb->next;
}
}
if(pa)
cur->next = pa;
else if(pb)
cur->next = pb;
else
cur->next = NULL;
ListNode *head = dummy->next;
lists.push_back(head);
lists.erase(lists.begin());
lists.erase(lists.begin());
delete dummy;
}
return lists.back();
}
};
方法四:
Runtime: 79 ms
class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
if(lists.empty()){
return nullptr;
}
while(lists.size() > 1){
lists.push_back(mergeTwoLists(lists[0], lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists.front();
}
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
if(l1 == nullptr){
return l2;
}
if(l2 == nullptr){
return l1;
}
if(l1->val <= l2->val){
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
Status: Accepted | |
Runtime:
359 ms
|