23. Merge k Sorted Lists

来源:互联网 发布:高三毕业后干什么知乎 编辑:程序博客网 时间:2024/06/05 17:35

原本想找一篇与分治策略有关的题目,便搜索了merge类的题目挑一篇做。

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

大意是将K个已经排好序的链表合并成一个链表。一开始打算运用分治法将其一分二,二分四分成n个基本子问题来求解,但由于链表头储存在向量中,设想难以实现,最后采取循环的方式两两合并,代码如下:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* mergeKLists(vector<ListNode*>& lists) {        if(lists.empty())   return NULL;        while(lists.size() > 1)        {            lists.push_back(merge(lists[0], lists[1]));            lists.erase(lists.begin());            lists.erase(lists.begin());        }        return lists.front();    }        ListNode* merge(ListNode* a, ListNode* b)    {        if(b == NULL)   return a;        else if(a == NULL)  return b;        else        {            ListNode* res;            if(a-> val <= b->val)            {                res = a;                sort(a, b);            }            else            {                res = b;                sort(a, b);            }            return res;        }    }        void sort(ListNode*a, ListNode* b)    {        while(a != NULL && b != NULL)        {            if(a->val <= b->val)            {                ListNode* temp = a->next;                if(a->next != NULL) a->next = (a->next->val <= b->val)?a->next:b;                 else a->next = b;                a = temp;            }            else            {                ListNode* temp = b->next;                if(b->next != NULL) b->next = (b->next->val < a->val)?b->next:a;                 else b->next = a;                b = temp;               }        }    }};

个人编写的merge和sort函数略复杂,有大神用仅仅几行的代码就可以替代这两个函数

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


原创粉丝点击