Merge k sorted List

来源:互联网 发布:java中重写equals的类 编辑:程序博客网 时间:2024/06/08 19:55

问题来源: leetcode

问题描述

合并k条有序链表。

问题分析

实际上,我们只需要把这个问题简化为n次两条有序链表的合并,一切就会迎刃而解。真正困难的部分也就是链表归并的代码。两路有序链表归并的思路也不复杂,就是不断的将两条链表中小的元素取出(按照升序)组成一条新的链表。

解决代码

/** * 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) {        if (lists.size() == 0) return NULL;        while (lists.size() > 1) {            lists.push_back(mergeList(*(lists.begin()), *((lists.begin()+1))));            lists.erase(lists.begin());            lists.erase(lists.begin());                }        return lists[0];    }    ListNode* mergeList(ListNode* l1, ListNode* l2) {        ListNode* tmp = NULL, *tmph = NULL;        while (l1 && l2) {            if (l1->val < l2->val) {                if (!tmp) tmph = tmp = l1;                else {                    tmp->next = l1;                    tmp = tmp->next;                }                l1 = l1->next;            } else {                if (!tmp) tmph = tmp = l2;                else {                    tmp->next = l2;                    tmp = tmp->next;                }                l2 = l2->next;            }        }        if (tmp)          tmp->next = l1 ? l1 : l2;        else          tmph = l1 ? l1 : l2;        return tmph;    }};