LeetCode 第23题 合并K个排序链表

/*

23. 合并K个排序链表

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

示例:

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

/** * Definition for singly-linked list.  public class ListNode { int val; ListNode next; ListNode(int * x) { val = x; } } */

/*思路1: 分治法,归并排序思路2: 优先队列*/
 1 class Solution23 {
 2
 3   /*
 4   分治法,归并排序.
 5    */
 6   public ListNode mergeKLists(ListNode[] lists) {
 7     if (lists == null || lists.length == 0) {
 8       return null;
 9     }
10     return sort(lists, 0, lists.length - 1);
11   }
12
13   ListNode sort(ListNode[] list, int left, int right) {
14     if (left < right) {
15       int mid = (left + right) >> 1;
16       ListNode le = sort(list, left, mid);
17       ListNode ri = sort(list, mid + 1, right);
18       return merge(le, ri);
19     }
20     return list[left];
21   }
22
23   ListNode merge(ListNode le, ListNode ri) {
24     if (le == null) {
25       return ri;
26     }
27     if (ri == null) {
28       return le;
29     }
30     if (le.val < ri.val) {
31       le.next = merge(le.next, ri);
32       return le;
33     } else {
34       ri.next = merge(le, ri.next);
35       return ri;
36     }
37   }
38
39   /*
40     优先队列式.
41    */
42   public ListNode mergeKLists2(ListNode[] lists) {
43
44     if (lists == null || lists.length == 0) {
45       return null;
46     }
47     if (lists.length == 1) {
48       return lists[0];
49     }
50     PriorityQueue<ListNode> queue = new PriorityQueue<>(Comparator.comparingInt(o -> o.val));
51     for (ListNode list : lists) {
52       if (list != null) {
53         queue.add(list);
54       }
55     }
56     ListNode dummy = new ListNode(0);
57     ListNode curr = dummy;
58     while (!queue.isEmpty()) {
59       curr.next = queue.poll();
60       curr = curr.next;
61       if (curr.next != null) {
62         queue.add(curr.next);
63       }
64     }
65     return dummy.next;
66   }
67 }


原文地址:https://www.cnblogs.com/rainbow-/p/10296459.html

时间: 2024-11-02 16:28:34

LeetCode 第23题 合并K个排序链表的相关文章

【LeetCode 23】合并K个排序链表

题目链接 [题解] 会归并排序吧? 就把这K个链表当成是K个数字就好. 然后做归并排序. 因为归并排序的时候本来就会有这么一个过程. [l..mid]和[mid+1..r]这两段区间都是有序的了已经. 然后再把他们俩合并起来. 合并起来之后把这个链表直接放在这个区间的最左边那个位置就好 上一级的合并要用的时候就直接取这个区间最左边那个链表. 有个人关于时间复杂度的证明说的挺好的贴一下 [代码] /** * Definition for singly-linked list. * struct L

每天AC系列(九):合并K个排序链表

1 题目 LeetCode第23题,合并k个有序的链表. 2 暴力法 直接遍历所有链表,取出所有节点的值,用数组存储,非降序排序,然后创建一个新链表用头插法依次插入节点. List<Integer> s = new ArrayList<>(); for(ListNode x:lists) { while(x != null) { s.add(x.val); x = x.next; } } s.sort((a,b) -> {return a.compareTo(b);}); L

[leetcode] 23. 合并K个排序链表

23. 合并K个排序链表 这个题算是考察代码功底吧,基本功,对变量与引用的理解. 不多说了,思路跟第21题基本一致,只不过从两个换成了多个 class Solution { public ListNode mergeKLists(ListNode[] lists) { List<ListNode> listNodes = new ArrayList<>(Arrays.asList(lists)); ListNode ans = new ListNode(Integer.MAX_VA

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

[LeetCode]23. 合并K个排序链表(优先队列;分治待做)

题目 合并?k?个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ ? 1->4->5, ? 1->3->4, ? 2->6] 输出: 1->1->2->3->4->4->5->6 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-k-sorted-lists 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 题解 方法

Java实现 亚博体育LeetCode 23 合并K个排序链表

合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6 PS:直接用PriorityQueue自动排序,改写一下compare方法. /** Definition for singly-linked list. public class ListNode { int val; ListNod

23. 合并K个排序链表

知乎ID: 码蹄疾 码蹄疾,毕业于哈尔滨工业大学. 小米广告第三代广告引擎的设计者.开发者: 负责小米应用商店.日历.开屏广告业务线研发:主导小米广告引擎多个模块重构: 关注推荐.搜索.广告领域相关知识; 题目 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度.示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6 分析 前面已经做过两个有序链表的合并,只

leetcode(14)-合并k个排序链表

合并?k?个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: #输入: [ ? 1->4->5, ? 1->3->4, ? 2->6 ] #输出: 1->1->2->3->4->4->5->6 链接:https://leetcode-cn.com/problems/merge-k-sorted-lists 自己的思路 在k个链表中找到一个比较节点,然后把k个链表分成两部分,一部分都比比较节点小,一部分都比比较节点大,

合并k个排序链表

题目 合并k个排序链表,并且返回合并后的排序链表.尝试分析和描述其复杂度. 样例 给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null 解题 两两合并 合并ab得到c 合并cd得到e /** * Definition for ListNode. * public class ListNode { * int val; * ListNode next; * ListNode(int val) { * this.val =