zoukankan      html  css  js  c++  java
  • [LeetCode] 23. 合并K个排序链表

    题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/

    题目描述:

    合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

    示例:

    输入:
    [
      1->4->5,
      1->3->4,
      2->6
    ]
    输出: 1->1->2->3->4->4->5->6
    

    思路:

    思路1:

    优先级队列

    时间复杂度:(O(n*log(k))),n是所有链表中元素的总和,k是链表个数.

    思路2:

    分而治之

    链表两两合并


    关注我的知乎专栏,了解更多解题技巧,我们一起来刷题,共同进步!

    代码:

    思路1:

    python

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def mergeKLists(self, lists: List[ListNode]) -> ListNode:
            import heapq
            dummy = ListNode(0)
            p = dummy
            head = []
            for i in range(len(lists)):
                if lists[i] :
                    heapq.heappush(head, (lists[i].val, i))
                    lists[i] = lists[i].next
            while head:
                val, idx = heapq.heappop(head)
                p.next = ListNode(val)
                p = p.next
                if lists[idx]:
                    heapq.heappush(head, (lists[idx].val, idx))
                    lists[idx] = lists[idx].next
            return dummy.next
    

    java

    /**
     * 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 == null || lists.length == 0) return null;
            PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
                @Override
                public int compare(ListNode o1, ListNode o2) {
                    if (o1.val < o2.val) return -1;
                    else if (o1.val == o2.val) return 0;
                    else return 1;
                }
            });
            ListNode dummy = new ListNode(0);
            ListNode p = dummy;
            for (ListNode node : lists) {
                if (node != null) queue.add(node);
            }
            while (!queue.isEmpty()) {
                p.next = queue.poll();
                p = p.next;
                if (p.next != null) queue.add(p.next);
            }
            return dummy.next;
        }
    }
    

    思路2:

    分而治之

    python

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def mergeKLists(self, lists: List[ListNode]) -> ListNode:
            if not lists:return 
            n = len(lists)
            return self.merge(lists, 0, n-1)
        def merge(self,lists, left, right):
            if left == right:
                return lists[left]
            mid = left + (right - left) // 2
            l1 = self.merge(lists, left, mid)
            l2 = self.merge(lists, mid+1, right)
            return self.mergeTwoLists(l1, l2)
        def mergeTwoLists(self,l1, l2):
            if not l1:return l2
            if not l2:return l1
            if l1.val < l2.val:
                l1.next = self.mergeTwoLists(l1.next, l2)
                return l1
            else:
                l2.next = self.mergeTwoLists(l1, l2.next)
                return l2
    

    java

    /**
     * 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 == null || lists.length == 0) return null;
            return merge(lists, 0, lists.length - 1);
        }
    
        private ListNode merge(ListNode[] lists, int left, int right) {
            if (left == right) return lists[left];
            int mid = left + (right - left) / 2;
            ListNode l1 = merge(lists, left, mid);
            ListNode l2 = merge(lists, mid + 1, right);
            return mergeTwoLists(l1, l2);
        }
    
        private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            if (l1 == null) return l2;
            if (l2 == null) return l1;
            if (l1.val < l2.val) {
                l1.next = mergeTwoLists(l1.next, l2);
                return l1;
            } else {
                l2.next = mergeTwoLists(l1,l2.next);
                return l2;
            }
        }
    }
    
  • 相关阅读:
    IDEA新建项目时,没有Spring Initializr选项
    idea 不下载jar包
    eclipse安装activiti designer
    idea上activiti插件的安装及使用
    activiti实战--第二章--搭建Activiti开发环境及简单示例
    activiti实战--第一章--认识Activiti
    jdk1.8中的for循环
    [原][bigemap][globalmapper]通过bigemap下载全球30米DEM高程数据(手动下载)(下载全球高精度dom卫片、影像、等高线、矢量路网、POI、行政边界)
    [转]OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)
    [转]osgconv工具简介
  • 原文地址:https://www.cnblogs.com/powercai/p/10779444.html
Copyright © 2011-2022 走看看