LeetCode之23---Merge k Sorted Lists

题目:

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

题目大意:

  给定k条有序链表,求k条链表有序合并后的链表。

思路:

  看到这道题感觉蛮亲切的,因为已经不止一次遇到链表有序合并的问题了,所以思路还是有的。

  第一个思路就是借助两个链表的合并,先将两个链表合并为结果链表,然后再将下一条链表合并到结果链表上,直到所有的链表都合并结束。

  当然,第一个思路的时间复杂度很高,所以肯定又是轰轰烈烈的超时了。所以,诞生了第二个思路:根据合并排序的思想,将链表从头和尾合并,每次合并之后都放在原来链表数组的前半部分,下一次循环直接合并前半部分,直到所有的链表合并完成。

代码1:

//每次合并一个链表到结果链表上,结果超时
class Solution {
public:
    ListNode* mergeKLists(std::vector<ListNode*>& lists) {
        ListNode *result = nullptr;
        const int size = lists.size();

        if (size == 0) {
            return result;
        } else if (size == 1) {
            return lists[0];
        }

        result = lists[0];

        for (int i = 1; i < size; ++i) {
            result = mergeTwoLists(result, lists[i]);
        }

        return result;
    }

private:
    ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)    //合并两个数组
    {
        ListNode *result = new ListNode(0);
        ListNode *p1 = l1;
        ListNode *p2 = l2, *tail = result;

        while (p1 && p2) {
            if (p1->val <= p2->val) {
                tail->next = p1;
                p1 = p1->next;
            } else {
                tail->next = p2;
                p2 = p2->next;
            }
            tail = tail->next;
        }

        if (p1) {
            tail->next = p1;
            p1 = p1->next;
        }

        if (p2) {
            tail->next = p2;
            p2 = p2->next;
        }

        tail = result;
        result = tail->next;
        delete(tail);

        return result;
    }
};

代码2:

class Solution {
public:
    ListNode* mergeKLists(std::vector<ListNode*>& lists) {
        const int size = lists.size();

        if (size == 0) {
            return nullptr;
        }

        int right = size - 1;
        while (right > 0) {
            int left = 0;
            while (left < right) {
                lists[left] = mergeTwoLists(lists[left], lists[right]);
                ++left;
                --right;
            }
        }

        return lists[0];
    }
private:
    ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)
    {
        ListNode *result = new ListNode(0);
        ListNode *p1 = l1;
        ListNode *p2 = l2, *tail = result;

        while (p1 && p2) {
            if (p1->val <= p2->val) {
                tail->next = p1;
                p1 = p1->next;
            } else {
                tail->next = p2;
                p2 = p2->next;
            }
            tail = tail->next;
        }

        if (p1) {
            tail->next = p1;
            p1 = p1->next;
        }

        if (p2) {
            tail->next = p2;
            p2 = p2->next;
        }

        tail = result;
        result = tail->next;
        delete(tail);

        return result;
    }
};

时间: 2024-10-12 17:11:29

LeetCode之23---Merge k Sorted Lists的相关文章

[Leetcode][Python]23: Merge k Sorted Lists

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 23: Merge k Sorted Listshttps://oj.leetcode.com/problems/merge-k-sorted-lists/ Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. ===Comments by

【一天一道LeetCode】#23. Merge k Sorted Lists

一天一道LeetCode系列 (一)题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. (二)解题 合并K个已拍好序的链表.剑指上有合并两个已排好序的链表的算法,那么K个数,我们可以采用归并排序的思想,不过合并函数可能需要修改一下,换成合并两个已排好序的链表的方法.代码如下: /** * Definition for singly-linked

【LeetCode】23. Merge k Sorted Lists

合并k个已合并链表. 思路:先把链表两两合并,直到合并至只有一个链表 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeKLists(vect

Python 解LeetCode:23. Merge k Sorted Lists

题目描述:把k个排序的链表组成的列表合并成一个排序的链表 思路: 使用堆排序,遍历列表,把每个列表中链表的头指针的值和头指针本身作为一个元素放在堆中: 第一步中遍历完列表后,此时堆中最多会有n个元素,n是列表的长度: 当堆不为空,取出堆中的最小值,然后把该值的指针指向下一个元素,并入堆: 第3步可以确保堆永远是o(n)大小的: 堆为空返回头结点就可以了 # Definition for singly-linked list. # class ListNode(object): # def __i

leetcode problem :23. Merge k Sorted Lists

class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { ListNode* head = NULL; ListNode* current = NULL; for (int i = 0; i < lists.size(); ++i){ if (!lists[i]){ lists.erase(lists.begin()+i); --i; } } while (lists.size()){ i

[LeetCode]23. Merge k Sorted Lists

23. Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 给定k个排序了的链表,合并k个链表成一个排序链表. 本程序思路: 1)首先得到K个链表的长度和存在len中 2)从K个链表中找到值最小的那个节点,把该节点添加到合并链表中 3)重复len次即可把所有节点添加到合并链表中. 注意事项: 1)K个链表中有的

23. Merge k Sorted Lists - LeetCode

Question 23.?Merge k Sorted Lists Solution 题目大意:合并链表数组(每个链表中的元素是有序的),要求合并后的链表也是有序的 思路:遍历链表数组,每次取最小节点 Java实现: public ListNode mergeKLists(ListNode[] lists) { ListNode preHead = new ListNode(0); ListNode minNode = getMinNode(lists); ListNode tmpNode =

#23 Merge k Sorted Lists (N路归并排序)

#23 Merge k Sorted Lists (N路归并排序) 题目地址:#23 题目分类:链表/归并排序/堆排序 题目难度:hard 题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 翻译:合并K个已经排序的链表,返回一个排序好的链表. 思路 暴力法,我们很容易想到:以一个for循环遍历所有的链表,找出最小的,然后将这个节点加入新的链表

23. Merge k Sorted Lists(js)

23. Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Example: Input: [   1->4->5,   1->3->4,   2->6 ] Output: 1->1->2->3->4->4->5->6题意:按大小顺序合并n条链表代码

leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:此题是由合并两个排序链表演化而来,刚开始,想法比较简单,像求最大公共前缀一样,逐一求解:但是最后超时,所以马上意识到出题方是为了使用归并和分治的方法,故重新写了代码. 代码一(超时未过): /** * Definition for singly-link