zoukankan      html  css  js  c++  java
  • LeetCode: Merge k Sorted Lists

    自己写的太复杂了,一开始想的是给开始的lists头们排序,然后从这个序列的第一个抽出来,然后再重新用二分法进行排序,不过这个方法large超时了,看了网上的发现还是用很土地方法用一个for循环从前两个开始merge到最后,不知道为什么自己把这个想这么复杂。

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *merge(ListNode *p, ListNode *q) {
    12         if (!p) return q;
    13         if (!q) return p;
    14         ListNode *ret = NULL;
    15         ListNode *reti;
    16         while (p && q) {
    17             if (!ret) {
    18                 ret = new ListNode(min(p->val, q->val));
    19                 reti = ret;
    20                 if (p->val < q->val) p = p->next;
    21                 else q = q->next;
    22             }
    23             else {
    24                 ListNode *tmp = new ListNode(min(p->val, q->val));
    25                 ret->next = tmp;
    26                 ret = ret->next;
    27                 if (p->val < q->val) p = p->next;
    28                 else q = q->next;
    29             }
    30         }
    31         if (!p) ret->next = q;
    32         if (!q) ret->next = p;
    33         return reti;
    34     }
    35     ListNode *mergeKLists(vector<ListNode *> &lists) {
    36         // Start typing your C/C++ solution below
    37         // DO NOT write int main() function
    38         if (!lists.size()) return NULL;
    39         ListNode *ret = lists[0];
    40         for (int i = 1; i < lists.size(); i++) ret = merge(ret, lists[i]);
    41         return ret;
    42     }
    43 };

     推荐下面这个更符合面试的代码

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 struct cmp {
    10     bool operator()(ListNode *a, ListNode *b) {
    11         return a->val > b->val;
    12     }
    13 };
    14 class Solution {
    15 public:
    16     ListNode *mergeKLists(vector<ListNode *> &lists) {
    17         priority_queue<ListNode*, vector<ListNode*>, cmp> S;
    18         if (lists.size() == 0) return NULL;
    19         for (int i = 0; i < lists.size(); i++) {
    20             if (lists[i]) S.push(lists[i]);
    21         }
    22         ListNode *ans = NULL;
    23         ListNode *p = ans;
    24         while (!S.empty()) {
    25             ListNode *tmp = S.top();
    26             if (!ans) {
    27                 ans = tmp;
    28                 p = ans;
    29             }
    30             else {
    31                 p->next = tmp;
    32                 p = p->next;
    33             }
    34             if (!tmp->next) S.pop();
    35             else {
    36                 tmp = tmp->next;
    37                 S.pop();
    38                 S.push(tmp);
    39             }
    40         }
    41         return ans;
    42     }
    43 };
  • 相关阅读:
    Linux mail 命令使用
    django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>
    django admin后台提示没有static样式相关的文件
    nginx+uwsgi<django web环境的搭建>
    CentOS 6.5升级Python和安装IPython
    关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思
    记一次创建LVM的日志记录
    django TEMPLATES
    Only the sqlmigrate and sqlflush commands can be used when an app has migrations.
    rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>
  • 原文地址:https://www.cnblogs.com/yingzhongwen/p/3010533.html
Copyright © 2011-2022 走看看