p122 合并 K 个有序链表(leetcode 23)

一:解题思路

方法一:之前做过一道合并2个链表的题目,那么第一种方法就是将数组中的链表两两合并,得到最后的结果。Time:O(k*n),Space:O(1)

方法二:采用分治法,两两合拼。不断递归,最后只剩下一个链表。Time:O(n*log(k)),Space:O(log(k))

二:完整代码示例 (C++版和Java版)

方法一C++:

class Solution
{
private:
    ListNode* mergeTwoSortedLists(ListNode* l1, ListNode* l2)
    {
        ListNode* dummy = new ListNode(0);
        ListNode* p = dummy;
        while (l1 != NULL && l2 != NULL)
        {
            if (l1->val < l2->val)
            {
                p->next = l1;
                l1 = l1->next;
            }
            else
            {
                p->next = l2;
                l2 = l2->next;
            }

            p = p->next;
        }

        if (l1 != NULL) p->next = l1;
        if (l2 != NULL) p->next = l2;

        return dummy->next;
    }
public:
    ListNode* mergeKLists(vector<ListNode*>& lists)
    {
        if (lists.size() == 0) return NULL;
        ListNode* result = NULL;
        for (ListNode* list : lists)
        {
            result = mergeTwoSortedLists(result,list);
        }

        return result;
    }
};

方法一Java:

class Solution
    {
        private ListNode mergeTwoSortedLists(ListNode l1,ListNode l2)
        {
              ListNode dummy=new ListNode(0);
              ListNode p=dummy;
              while (l1!=null && l2!=null)
              {
                  if(l1.val<l2.val)
                  {
                      p.next=l1;
                      l1=l1.next;
                  }
                  else
                  {
                      p.next=l2;
                      l2=l2.next;
                  }
                  p=p.next;
              }

              if(l1!=null) p.next=l1;
              if(l2!=null) p.next=l2;

              return dummy.next;
        }

        public ListNode mergeKLists(ListNode[] lists)
        {
               if(lists==null || lists.length==0) return null;
               ListNode result=null;
               for(ListNode list:lists)
               {
                   result=mergeTwoSortedLists(result,list);
               }

               return result;
        }
    }

方法二C++:

class Solution
{
private:
    ListNode* mergeTwoSortedList(ListNode* l1, ListNode* l2)
    {
            ListNode* dummy = new ListNode(0);
            ListNode* p = dummy;
            while (l1 != NULL && l2 != NULL)
            {
                if (l1->val < l2->val)
                {
                    p->next = l1;
                    l1 = l1->next;
                }
                else
                {
                    p->next = l2;
                    l2 = l2->next;
                }

                p=p->next;
            }

            if (l1 != NULL) p->next = l1;
            if (l2 != NULL) p->next = l2;

            return dummy->next;
    }

    ListNode* merge(vector<ListNode*>& lists, int start, int end)
    {
        if (start == end) return lists[start];
        if (start > end) return NULL;
        int mid = start + (end-start) / 2;
        ListNode* left = merge(lists,start,mid);
        ListNode* right = merge(lists,mid+1,end);

        return mergeTwoSortedList(left,right);
    }
public:
    ListNode* mergeKLists(vector<ListNode*>& lists)
    {
        if (lists.size() == 0) return NULL;

        return merge(lists,0,lists.size()-1);
    }
};

方法二Java:

class Solution
    {
        private ListNode mergeTwoSortedList(ListNode l1,ListNode l2)
        {
                ListNode dummy=new ListNode(0);
                ListNode p=dummy;
                while (l1!=null && l2!=null)
                {
                    if(l1.val<l2.val)
                    {
                        p.next=l1;
                        l1=l1.next;
                    }
                    else
                    {
                        p.next=l2;
                        l2=l2.next;
                    }
                    p=p.next;
                }

                if(l1!=null) p.next=l1;
                if(l2!=null) p.next=l2;

                return dummy.next;
        }
        private ListNode merge(ListNode[] lists,int start,int end)
        {
               if(start==end) return lists[start];
               if(start>end) return null;
               int mid=start+(end-start)/2;
               ListNode left=merge(lists,start,mid);
               ListNode right=merge(lists,mid+1,end);

               return mergeTwoSortedList(left,right);
        }

        public ListNode mergeKLists(ListNode[] lists)
        {
               if(lists==null || lists.length==0) return null;

               return merge(lists,0,lists.length-1);
        }
    }

原文地址:https://www.cnblogs.com/repinkply/p/12694187.html

时间: 2024-08-30 13:24:37

p122 合并 K 个有序链表(leetcode 23)的相关文章

[LeetCode] 23. Merge k Sorted Lists 合并k个有序链表

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 与21. Merge Two Sorted Lists的拓展,这道题要合并k个有序链表,还是可以两两合并. 类似题目: [LeetCode] 21. Merge Two Sorted Lists 合并有序链表 原文地址:https://www.cnblogs.com/lightwindy/p/8512

leetcode python 012 hard 合并k个有序链表

#[LeetCode] Merge k Sorted Lists 合并k个有序链表(升序) import numpy as npimport time class Node(object):    def __init__(self,n,next_node=None):        self.data=n        self.next=next_node    class linklist(object):    def __init__(self):        self.head=N

合并k个有序链表

题目: 合并k个有序链表,并将结果用一个有序链表输出 例如:输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1->1->2->3->4->4->5->6 思路: 假设k个链表的总元素数目为n.首先想到两两合并列表,在序列1和2合并,3和4合并,依次类推.直到合并的只剩一个链表.这种操作的时间复杂度为O(nlog(k)),空间复杂度为O(1).python代码如下: class Solution(obj

leetcode 23 合并 k 个有序链表

问题描述 * leetcode 23,  Merge k Sorted Lists 解题思路 合并2个有序链表的进阶版,很容易想到,利用分治进行处理. 把个数大于2的集合 两两划分处理,最后再做最后一步的处理. 1 public class Solution { 2 public ListNode mergeKLists(ListNode[] lists) { 3 if (lists.length==0 || lists==null) { return null; } 4 return merg

23. Merge k Sorted Lists 合并K个有序链表

这道题是21题合并2个有序链表的升级版本,看了许多解题思路: A:直接暴力解锁,全部放进一个堆,然后依次吐出来: B:利用21题的算法,循环一次做两两合并,这样就得到结果:但是时间复杂度有点差: C:利用归并排序思想,进行分治:其实就是利用递归,牺牲空间,提升时间效率: 存在的问题是:看过了许多解答后发现,大家基于的给定数据类型是 List<ListNode>/ArrayList<ListNode>,然后,现在系统更新了,给的数据类型是 ListNode[] lists,所以,我现

经典算法——合并K个有序链表

一.题目要求: 将K个有序链表合并为一个有序链表 二.实现方法: 方法一:利用最小堆方法 用一个大小为K的最小堆(用优先队列+自定义降序实现)(优先队列就是大顶堆,队头元素最大,自定义为降序后,就变成小顶堆,队头元素最小),先把K个链表的头结点放入堆中,每次取堆顶元素,然后将堆顶元素所在链表的下一个结点加入堆中. 整体测试代码: #include <vector> #include <iostream> #include<queue> #include<set&g

23. 合并K个排序链表-LeetCode

心得:仿照归并排序,两两合并,注意更新的判断条件,注意事项看代码!!! 注意判断条件. ** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeKLists(ListNode[] lists) { if(lists=

21. 合并两个有序链表-LeetCode

心得:链表问题加头指针,头指针要加一个引用(两个引用:一个用来遍历,另一个输出头节点,注意head.next) 输出完要将后面没有添加上的节点添加上. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeTwo

LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)

23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k Sorted Lists困难 示例: 输入: [ ??1->4->5, ??1->3->4, ??2->6] 输出: 1->1->2->3->4->4->5->6 Java 实现 public class ListNode { int va