合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路:在第二十一题合并两个有序链表的扩展,需要一个比较方法,基本就是二十一题的解法。现在需要做的是两两合并链表,按顺序合并显然太过麻烦。于是,让第i个和i+m比较(m指的是链表长度的一半),m=(lists.length+1)/2。**为什么加1?**为了当链表个数为奇数之时,可以将中间那条链表掠过,比如有a,b,c,d,e共5个链表,那么m=3,会将c那条链表掠过,a和d合并,b和e合并。
/**
* 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 n=lists.length;
if(n==0)
return null;
while(n>1)
{
int m=(n+1)/2;
for(int i=0;i<n/2;i++)//是n/2
{
lists[i]=compare(lists[i],lists[i+m]);
}
n=m;
}
return lists[0];
}
ListNode compare(ListNode x,ListNode y)
{
ListNode list=new ListNode(0);
ListNode list2=list;
while(x!=null&&y!=null)
{
if(x.val>y.val)
{
list.next=y;
y=y.next;
}
else
{
list.next=x;
x=x.next;
}
list=list.next;
}
if(y==null)
{
list.next=x;
}
else
{
list.next=y;
}
return list2.next;
}
}