合并有序链表的快速解法
题目要求以及解法
合并 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处理的速度大于内存读写的速度,因此现在的算法效率不能用元素的比较次数来衡量快慢,而是考虑算法存取元素的次数)