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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值