Java合并有序链表的快速解法

题目要求以及解法

合并 k 个有序链表,返回合并后的排序链表。

示例:

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

思路和解法

既然最后要求是有序的链表,那么实际上可以把这个问题等同于k个数组,求合并后的有序数组,而不必局限于链表的思路中去。
那解法也很简单,遍历所有链表数据一遍,将数据放入数组中去,然后再排序一次,将数组组装成链表即可。

/**
 * 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.length<1) return null;
        if(lists.length==1) return lists[0];
        int num=0;
        for(ListNode node : lists){
            while(node!=null){
                num++;
                node=node.next;
            }
        }
        int arr[] = new int[num];
        int i = 0;
        for(ListNode node : lists){
            while(node!=null){
                arr[i] = node.val;
                i++;
                node=node.next;
            }
        }
        if (arr.length==0)return null;
        Arrays.sort(arr);

        ListNode res = new ListNode(arr[0]);
        ListNode tmp = res;
        for(int j=1;j<num;j++){
            tmp.next=new ListNode(arr[j]);
            tmp=tmp.next;
        }
        return res;
    }
}

Java Arrays.sort()

因为在代码中用到了Arrays.sort(),我就去源码里看了一下

public static void sort(int[] a) {
        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
    }

本人英语不太好,所以就看懂了quicksort,快排嘛,但是百度了一下发现不对劲,不是我在学校里所知道的快排,而是俄罗斯人Vladimir Yaroslavskiy在2009年开发出来的Dual-Pivot快排,即双轴快排,如要理解请自行百度,(双轴快排比经典快排更快的原因是考虑到了CPU处理的速度大于内存读写的速度,因此现在的算法效率不能用元素的比较次数来衡量快慢,而是考虑算法存取元素的次数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值