zoukankan      html  css  js  c++  java
  • 23. 合并K个排序链表

    合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
    示例:
     
    输入:
    [
      1->4->5,
      1->3->4,
      2->6
    ]
    输出: 1->1->2->3->4->4->5->6
     
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
     
    思路 1
    将所有节点放到 vector 中,再排序vector,将节点相连
     1 bool cmp(const ListNode *a, const ListNode *b) {
     2     return a->val < b->val;
     3 }
     4 
     5 class Solution {
     6 public:
     7     ListNode* mergeKLists(vector<ListNode*>& lists) {
     8         vector<ListNode *> node_vec;
     9         for (int i = 0; i < lists.size(); ++i) {
    10             ListNode *head = lists[i];
    11             while (head) {
    12                 node_vec.push_back(head);//全部节点都放到 vector
    13                 head = head->next;
    14             }
    15         }
    16         if (node_vec.size() == 0) {
    17             return NULL;
    18         }
    19         sort(node_vec.begin(), node_vec.end(), cmp);//根据数据域排序
    20         for (int i = 1; i < node_vec.size(); ++i) {
    21             node_vec[i-1]->next = node_vec[i];//连接链表
    22         }
    23         node_vec.back()->next = NULL;
    24         return node_vec[0];
    25     }
    26 };
    思路 2
    对 k 个链表进行分治,两个链表就合并

     1 class Solution {
     2 private:
     3     ListNode* mergeTwoLists(ListNode *head1, ListNode *head2) {
     4         ListNode temp_head(0);
     5         ListNode *ptr = &temp_head;
     6         
     7         while (head1 && head2) {
     8             if (head1->val < head2->val) {
     9                 ptr->next = head1;
    10                 head1 = head1->next;
    11             } else {
    12                 ptr->next = head2;
    13                 head2 = head2->next;
    14             }
    15             ptr = ptr->next;
    16         }
    17         if (head1) {
    18             ptr->next = head1;
    19         }
    20         if (head2) {
    21             ptr->next = head2;
    22         }
    23         return temp_head.next;
    24     }
    25 public:
    26     ListNode* mergeKLists(vector<ListNode*>& lists) {
    27         if (lists.empty()) return NULL;
    28         if (lists.size() == 1) return lists.front();
    29         if (lists.size() == 2) return mergeTwoLists(lists.front(), lists.back());//两个链表就合并
    30         
    31         int mid = lists.size()/2;
    32         vector<ListNode *> sub1_list;//将链表分为两部分
    33         vector<ListNode *> sub2_list;
    34         for (int i = 0; i < mid; ++i) {
    35             sub1_list.push_back(lists[i]);
    36         }
    37         for (int i = mid; i < lists.size(); ++i) {
    38             sub2_list.push_back(lists[i]);
    39         }
    40         ListNode *l1 = mergeKLists(sub1_list);//接着分,直到两部分链表所有节点都排好序
    41         ListNode *l2 = mergeKLists(sub2_list);
    42         
    43         return mergeTwoLists(l1, l2);
    44     }
    45 };

  • 相关阅读:
    Linux之ARP——种种
    Linux之内核参数——backlog/somaxconn
    CLOSE_WAIT、CLOSE_WAIT原因,危害,如何避免
    OVS——大杂烩
    Linux 网络栈——
    OpenShift——大杂烩
    协议之ICMP——种种
    Neutron 理解 (8): Neutron 是如何实现虚机防火墙的 [How Neutron Implements Security Group]
    Neutron 理解 (6): Neutron 是怎么实现虚拟三层网络的 [How Neutron implements virtual L3 network]
    CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)
  • 原文地址:https://www.cnblogs.com/i-8023-/p/11826427.html
Copyright © 2011-2022 走看看