• 【LeetCode练习题】Merge k Sorted Lists


    Merge k Sorted Lists

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

    题目意思:

    合并K条已经排序的链表。分析时间复杂度。

    解题思路:

    很容易就想起之前学的合并两条链表的算法,这一题其实就是那个题目的扩展,变成合并K条了。我采用的方法就是迭代法。

    如果只有一条,直接返回。如果只有两条,就只需要调用mergeTwo一下。如果超过两条链表的话,先将前两个链表调用mergeTwo,然后用新的链表和第三个链表调用mergeTwo,再用结果和第四个链表调用mergeTwo,依次调用到最后一个链表。

    时间复杂度貌似是O(n2)……有点慢。Orz~不过AC了。

    有一点就是我这里用来合并两个链表的方法mergeTwo是用递归实现的(《剑指offer》第116页中代码),课本上是用循环的。大家可以参考一下。

    其实更有效率的方法就是归并法,即先lists分成一半,再分成一半,直到分成只有两个了再调用一下mergeTwo。这样效率会高很多。mark一下,该方法代码以后看心情补上。

    代码如下:

     1 class Solution {
     2 public:
     3     ListNode *mergeKLists(vector<ListNode *> &lists) {
     4         if(lists.size() == 1){
     5             return lists[0];
     6         }   
     7         if(lists.size() == 2){
     8             ListNode *ret;
     9             ret = mergeTwo(lists[0],lists[1]);
    10             return ret;
    11         }
    12         if(lists.size() > 2){
    13             ListNode *p = NULL;
    14             p = mergeTwo(lists[0],lists[1]);
    15             for(int i = 2; i < lists.size(); i++){
    16                 p = mergeTwo(p,lists[i]);
    17             }
    18             return p;
    19         }
    20     }
    21     
    22     ListNode *mergeTwo(ListNode *list1,ListNode *list2){
    23         //合并list1和list2,返回新的list3的头结点指针
    24         if(list1 == NULL){
    25             return list2;
    26         }
    27         else if(list2 == NULL){
    28             return list1;
    29         }
    30         
    31         ListNode *list3 = NULL;
    32         
    33         if(list1->val < list2->val){
    34             list3 = list1;
    35             list3->next = mergeTwo(list1->next,list2);
    36         }
    37         else{
    38             list3 = list2;
    39             list3->next = mergeTwo(list1,list2->next);
    40         }
    41         return list3;
    42     }
    43 };
  • 相关阅读:
    Linux内核的整体框架
    Unix环境高级编程_文件和目录
    Unix环境高级编程_文件I/O
    u-boot启动的第二阶段
    linux基础之vi编辑器设置文件模板
    ARM linux开发之安装配置tftp
    STM32笔试题笔记
    linux基础之find命令常用用法
    ARM linux开发之根文件系统
    ARM linux开发之linux内核启动简介
  • 原文地址:https://www.cnblogs.com/4everlove/p/3647333.html
Copyright © 2020-2023  润新知