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

  

 

posted @ 2013-12-12 15:46  果汁果粒  阅读(184)  评论(0编辑  收藏  举报