leetcode-23. Merge k Sorted Lists

题目类型:

链表、分治、归并

21题的变式

题意:

合并k个已排序的链表

解法一:暴力–错误

  • 复杂度O(k^2^ * N)
    类似两个链表的合并,第一个节点全部对比,小的取出,指针后移,再比较。。。。

解法二:暴力

  • 遍历k个链表,将节点全部添加至集合,对集合排序。

解法三:分治–归并排序

复杂度O(kNlogN)

  • 两个链表排序
  • 四个链表
  • 8个。。
  • 。。。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        int len = lists.length;
        if (len == 0) {
            return null;
        }
        return mergerSort(lists, 0, len - 1);
    }

    private ListNode mergerSort(ListNode[] lists, int left, int right) {
        if (left == right) {
            return lists[left];
        }
        else if (left < right) {
            int mid = left + (right - left) / 2;
            ListNode first = mergerSort(lists, left, mid);
            ListNode second = mergerSort(lists, mid + 1, right);
            return mergeTwoLists(first, second);
        }
        return null;
    }

    private ListNode mergeTwoLists(ListNode a, ListNode b) {
        ListNode node = new ListNode(0);
        ListNode copy = node;
        while (a != null && b != null) {
            if(a.val <= b.val){
                node.next = a;
                a = a.next;
            }
            else {
                node.next = b;
                b = b.next;
            }
            node = node.next;
        }
        if (a != null) {
            node.next = a;
        }
        else if(b != null){
            node.next = b;
        }
        return copy.next;
    }
}

猜你喜欢

转载自blog.csdn.net/NNnora/article/details/81485603
今日推荐