zoukankan      html  css  js  c++  java
  • 【LeetCode】20. Merge k Sorted Lists

    这一放,居然放了一个多月,上一题是11月3日的 19.Remove Nth Node From End of List 

    今天已经12月12日了,真是时不我待!原来不被管束已经一个多月了,我也是如此不自觉。想想如果这段时间我坚持每天做一题,现在的题号就是19+38=57了。。。

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

    题解:(解法一)忘记是不是做过Merge 2 sorted linked lists 了,这题用之前Pin给我看的那篇简而化之的文章应该是挺好想到的。先考虑两个链表的情况,写个函数,再做k-1次。

      刚开始没有考虑到可能存在空的链表,加了空链表判断后,不是写成现在的return l2;而是直接head=l2,最后再统一return head; 这样是错误的,因为后面有

         if(l1!=NULL){
                p->next=l1;
            }else if(l2!=NULL){
                p->next=l2;
            }
    的操作, 这时候 p 为 NULL,会出现Runtime Error.正确的做法是直接return.
    if(l1==NULL) return l2;
    else if(l2==NULL) return l1;

    (解法二)自已想的是 比较链表首部的k个数,对这k个数用堆排序或者快排,找到最小的那个数放到所求的链表中,记录最小数所在的链表,让该链表指针后移。比较N次。。发现还是挺麻烦的。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        
        ListNode *mergeTwoLists(ListNode *l1,ListNode *l2) {
            ListNode *head=NULL;
            ListNode *p=NULL;
            if(l1==NULL) return l2;
            else if(l2==NULL) return l1;
            while(l1&&l2){
                ListNode *temp=NULL;
                if(l1->val < l2->val){
                    temp=l1;
                    l1=l1->next;
                }else{
                    temp=l2;
                    l2=l2->next;
                }
                if(head==NULL){
                    head=temp;
                    p=temp;
                }else{
                    p->next=temp;
                    p=p->next;
                }
            }
            if(l1!=NULL){
                p->next=l1;
            }else if(l2!=NULL){
                p->next=l2;
            }
            return head;
        }
    
        ListNode *mergeKLists(vector<ListNode *> &lists) {
            if (lists.size()==0)
                return NULL;
            ListNode *head=lists[0];
            for(int i=1;i<lists.size();i++){
                head=mergeTwoLists(head,lists[i]);
            }
            return head;
        }
    };
    

      

     

  • 相关阅读:
    JSP标准标签库(JSTL)--JSTL简介与安装
    JSP标签编程--简单标签
    Tomcat数据源
    Linux 更新vim
    perl 函数
    js 使用a标签 下载资源
    js arrayBuffer 字节序问题,小端法,大端法
    js 的 ArrayBuffer 和 dataView
    ajax 获取服务器返回的XML字符串
    遍历form表单里面的表单元素,取其value
  • 原文地址:https://www.cnblogs.com/guozhiguoli/p/3471274.html
Copyright © 2011-2022 走看看