[LeetCode] Merge k Sorted Lists

来源:互联网 发布:qq三国奥义感悟的算法 编辑:程序博客网 时间:2024/05/16 06:25

先merge两个list,注意在merge完之后可以delete掉原来的指针,释放内存

之后在k个listmerge中,用front和rear从头到尾merge,注意merge的list放在front的位置,循环被破坏的条件是front>rear(奇数)front==rear(偶数)这两种情况下,rear都是不用变化的,front指向0即可,当rear==0时返回
注意即时释放内存

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* mergeKLists(vector<ListNode*>& lists) {        vector<ListNode*>::size_type sz = lists.size();        if(sz==0)     return NULL;        if(sz==1)     return lists[0];        vector<ListNode*>::size_type front = 0;        vector<ListNode*>::size_type rear = lists.size()-1;           ListNode *p1;        ListNode *p2;        while(front < rear){            p1 = lists[front];            p2 = lists[rear];            lists[front] = mergeTwo(p1,p2);            ++front,--rear;            delete p1;            delete p2;            if(rear == 0)                return lists[0];            if(front>=rear)                front =0;        }    }    ListNode* mergeTwo(ListNode *l1, ListNode *l2){        ListNode *Head=NULL;        ListNode *p=NULL;        while(l1!=NULL||l2!=NULL){            int tmp;            if(l1!=NULL&l2!=NULL)            {                if(l1->val <l2->val){                    tmp=l1->val;                    l1 = l1->next;                }                else{                    tmp = l2->val;                    l2 = l2->next;                }            }            else if(l1==NULL){                tmp  = l2->val;                l2 = l2->next;            }            else{                tmp = l1->val;                l1= l1->next;            }            ListNode *p2 = new ListNode(tmp);            if(Head ==NULL)                Head = p2;            else                p->next = p2;            p = p2;        }        return Head;    }};
0 0