给你一个链表数组,每个链表都已经按升序排列。

    请你将所有链表合并到一个升序链表中,返回合并后的链表。

    示例 1:

    输入:lists = [[1,4,5],[1,3,4],[2,6]]

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

    解释:链表数组如下:

    [

    1->4->5,

    1->3->4,

    2->6

    ]

    将它们合并到一个有序链表中得到。

    1->1->2->3->4->4->5->6

    示例 2:

    输入:lists = []

    输出:[]

    示例 3:

    输入:lists = [[]]

    输出:[]

    提示:

    k == lists.length

    0 <= k <= 10^4

    0 <= lists[i].length <= 500

    -10^4 <= lists[i][j] <= 10^4

    lists[i] 按 升序 排列

    lists[i].length 的总和不超过 10^4

    来源:力扣(LeetCode)

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

    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode(int x) { val = x; }
    7. * }
    8. */
    9. class Solution {
    10. public ListNode mergeKLists(ListNode[] lists) {
    11. if(lists == null) return null;
    12. ListNode root = new ListNode(0);
    13. ListNode next = root;
    14. while(true){
    15. int index = -1;
    16. int val = Integer.MAX_VALUE;
    17. for(int i = 0; i < lists.length; i++){
    18. if(lists[i] != null && lists[i].val < val){
    19. val = lists[i].val;
    20. index = i;
    21. }
    22. }
    23. if(index != -1){
    24. next.next = lists[index];
    25. next = next.next;
    26. lists[index] = lists[index].next;
    27. continue;
    28. }
    29. break;
    30. }
    31. return root.next;
    32. }
    33. }

    常规遍历,时间复杂度O(k kn)
    *通常情况下,遍历都可以转化成分治法,比如找出序列中的最大(小)值,这道题也可以。

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode(int x) { val = x; }
    7. * }
    8. */
    9. class Solution {
    10. public ListNode mergeKLists(ListNode[] lists) {
    11. if(lists == null || lists.length == 0) return null;
    12. return mergeLists(lists, 0, lists.length - 1);
    13. }
    14. public ListNode mergeLists(ListNode[] lists, int low, int high){
    15. if(low == high) return lists[low];
    16. int mid = (low + high) / 2;
    17. ListNode l1 = mergeLists(lists, low, mid);
    18. ListNode l2 = mergeLists(lists, mid + 1, high);
    19. ListNode head = new ListNode(0);
    20. ListNode cur = head;
    21. while(l1 != null && l2 != null){
    22. if(l1.val <= l2.val){
    23. cur.next = l1;
    24. l1 = l1.next;
    25. }else{
    26. cur.next = l2;
    27. l2 = l2.next;
    28. }
    29. cur = cur.next;
    30. }
    31. if(l1 != null) cur.next = l1;
    32. if(l2 != null) cur.next = l2;
    33. return head.next;
    34. }
    35. }

    O(k n logk)