LeetCode - 23. Merge k Sorted Lists

简介: 23. Merge k Sorted Lists  Problem's Link  ---------------------------------------------------------------------------- Mean:  将k个有序链表合并为一个有序链表.

23. Merge k Sorted Lists 

Problem's Link

 ----------------------------------------------------------------------------

Mean: 

将k个有序链表合并为一个有序链表.

analyse:

方法一:本着不重复发明轮子的原则,使用两两合并,就可以利用前面已经做过的Merge two Sorted Lists.

方法二:抖机灵.将所有结点的val都push_back在一个vector容器中,排序后又重新构造链表.

Time complexity: O(N)

 

view code

方法一:

ListNode * mergeKLists( vector < ListNode *> & lists) {
    if( lists . empty ()){
        return nullptr;
    }
    while( lists . size() > 1 ){
        lists . push_back( mergeTwoLists( lists [ 0 ], lists [ 1 ]));
        lists . erase( lists . begin());
        lists . erase( lists . begin());
    }
    return lists . front();
}
ListNode * mergeTwoLists( ListNode * l1 , ListNode * l2) {
    if( l1 == nullptr ){
        return l2;
    }
    if( l2 == nullptr ){
        return l1;
    }
    if( l1 -> val <= l2 -> val ){
        l1 -> next = mergeTwoLists( l1 -> next , l2);
        return l1;
    }
    else {
        l2 -> next = mergeTwoLists( l1 , l2 -> next);
        return l2;
    }
}

方法二:

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-02-18-09.02
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long( LL);
typedef unsigned long long( ULL);
const double eps( 1e-8);

// 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 < int > nodeVal;
        for( auto ptr: lists)
        {
            while( ptr)
            {
                nodeVal . push_back( ptr -> val);
                ptr = ptr -> next;
            }
        }
        if( nodeVal . size() <= 0)
        {
            return nullptr;
        }

        sort( nodeVal . begin (), nodeVal . end());
        bool isFirst = 1;
        ListNode * res = nullptr , * head = nullptr;
        for( auto p: nodeVal)
        {
            if( isFirst)
            {
                isFirst = 0;
                head = new ListNode(p);
                res = head;
            }
            else
            {
                head -> next = new ListNode(p);
                head = head -> next;
            }
        }
        return res;
    }
};

ListNode * getList( vector < int >& arr)
{
    bool isFirst = 1;
    ListNode * res = nullptr , * head = nullptr;
    for( auto p: arr)
    {
        if( isFirst)
        {
            isFirst = 0;
            head = new ListNode(p);
            res = head;
        }
        else
        {
            head -> next = new ListNode(p);
            head = head -> next;
        }
    }
    return res;
}

int main()
{
    Solution solution;
    int n;
    while( cin >>n)
    {
        vector < ListNode *> listVe;
        while(n --)
        {
            int num;
            cin >> num;
            vector < int > ve;
            for( int i = 0; i < num; ++ i)
            {
                int tmp;
                cin >> tmp;
                ve . push_back( tmp);
            }
            listVe . push_back( getList( ve));
        }
        ListNode * head = solution . mergeKLists( listVe);
        while( head)
        {
            cout << head -> val << " ";
            head = head -> next;
        }
        cout << "End." << endl;
    }
    return 0;
}
/*

*/
目录
相关文章
Leetcode 4. Median of Two Sorted Arrays
题目描述很简单,就是找到两个有序数组合并后的中位数,要求时间复杂度O(log (m+n))。 如果不要去时间复杂度,很容易就想到了归并排序,归并排序的时间复杂度是O(m+n),空间复杂度也是O(m+n),不满足题目要求,其实我开始也不知道怎么做,后来看了别人的博客才知道有个二分法求两个有序数组中第k大数的方法。
41 0
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
49 0
|
Python
LeetCode 378. Kth S Element in a Sorted Matrix
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。 请注意,它是排序后的第k小元素,而不是第k个元素。
108 0
LeetCode 378. Kth S Element in a Sorted Matrix
|
算法
LeetCode Find Minimum in Rotated Sorted Array II
假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 注意数组中可能存在重复的元素。
87 0
LeetCode Find Minimum in Rotated Sorted Array II
LeetCode 153. Find Minimum in Rotated Sorted Array
假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 请找出其中最小的元素。 你可以假设数组中不存在重复元素。
107 0
LeetCode 153. Find Minimum in Rotated Sorted Array
LeetCode 109. Convert Sorted List to BST
给定一个链表,其中元素按升序排序,将其转换为高度平衡的BST。 对于这个问题,高度平衡的二叉树被定义为:二叉树中每个节点的两个子树的深度从不相差超过1。
60 0
LeetCode 109. Convert Sorted List to BST
LeetCode 108. Convert Sorted Array to BST
给定一个数组,其中元素按升序排序,将其转换为高度平衡的BST。 对于这个问题,高度平衡的二叉树被定义为:二叉树中每个节点的两个子树的深度从不相差超过1。
78 0
LeetCode 108. Convert Sorted Array to BST
LeetCode 88. Merge Sorted Array
题意是给定了两个排好序的数组,让把这两个数组合并,不要使用额外的空间,把第二个数组放到第一个数组之中.
85 0
LeetCode 88. Merge Sorted Array
LeetCode 167 Two Sum II - Input array is sorted(输入已排序数组,求其中两个数的和等于给定的数)
给定一个有序数组和一个目标值 找出数组中两个成员,两者之和为目标值,并顺序输出
88 0
|
算法 Python
LeetCode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree
LeetCode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree