leetcode题解c++ | 23. Merge k Sorted Lists

来源:互联网 发布:人工智能研究生 编辑:程序博客网 时间:2024/05/29 19:38

题目https://leetcode.com/problems/merge-k-sorted-lists/#/description

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

分析

合并k个有序链表,其本质就是合并2个有序链表(用递归代码会更简洁),然后作k-1次就可以了。如果每次合并的链表是最短的,那应该时间最短,这个可以用小根堆实现(我的版本没有实现这个优化)。

c++实现

class Solution {public:    ListNode* mergeTwoLists(ListNode *l1, ListNode *l2)    {        if(l1==NULL && l2==NULL)            return NULL;        ListNode head(1);        ListNode *p = &head;        while(l1!=NULL && l2!=NULL)        {            if(l1->val < l2->val)            {                p->next = l1;                p = p->next;                l1 = l1->next;            }            else            {                p->next = l2;                p = p->next;                l2 = l2->next;            }            p->next = NULL;        }        if(l1!=NULL)            p->next = l1;        else            p->next = l2;        return head.next;    }        ListNode* mergeKLists(vector<ListNode*>& lists)    {        if(lists.size()==0)            return NULL;        while(lists.size()>1)        {            lists.push_back(mergeTwoLists(lists[0],lists[1]));            lists.erase(lists.begin());            lists.erase(lists.begin());        }        return lists[0];    }};


合并两个链表的递归版

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;    }}


0 0
原创粉丝点击