Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
思路:在mergeTwoLists的基础上,利用二路归并的方法,0和1 结合,2和3结合、……n-1和n结合。递归知道合并成一个list。
package com.Hard.Ryan;
import java.util.Iterator;
import com.Easy.wanghao.MergeTwoSortedLists.ListNode;
public class MergekSortedLists {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public static void main(String[] args) {
MergekSortedLists mLists=new MergekSortedLists();
ListNode[] lists = new ListNode[2];
lists[0]=new ListNode(1);
lists[1]=new ListNode(1);
lists[0].next=new ListNode(1);
lists[0].next.next=new ListNode(2);
lists[0].next.next.next=new ListNode(3);
lists[1].next=new ListNode(3);
lists[1].next.next=new ListNode(4);
ListNode resListNode=mLists.mergeKLists(lists);
for (; resListNode != null; resListNode = resListNode.next) {
System.out.println(resListNode.val);
}
}
public ListNode mergeKLists(ListNode[] lists) {
for(int i = 1;i < lists.length;i *= 2)
for(int j = 0;j+i < lists.length;j += 2*i)
lists[j]=mergeTwoLists(lists[j],lists[j+i]);
return lists.length==0?null:lists[0];
}
public ListNode mergeTwoLists(ListNode l1,ListNode l2) {
ListNode l3=new ListNode(0);
ListNode tmpListNode=l3;
while (l1!=null&&l2!=null) {
if (l1.val<l2.val) {
l3.next=l1;
l1=l1.next;
}
else{
l3.next=l2;
l2=l2.next;
}
l3=l3.next;
}
if (l1!=null) {
l3.next=l1;
}
else {
l3.next=l2;
}
return tmpListNode.next;
}
}