题目:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路:
采用分治法,利用两两合并函数
代码:
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0)
{
return null;
}
List<ListNode> newlists=new ArrayList<>();
int n=lists.length;
for(int i=0;i<n;i=i+1)
{
newlists.add(lists[i]);
}
while(newlists.size()!=1)
{
ListNode root=mergeTwoLists(newlists.get(0), newlists.get(1));
newlists.add(root);
newlists.remove(0);
newlists.remove(0);
}
return newlists.get(0);
}
public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null&&l2==null)
{
return l1;
}
ListNode pListNode=l1;
ListNode qListNode=l2;
ListNode root=new ListNode(0);
ListNode tListNode=root;
while(pListNode!=null&&qListNode!=null)
{
if(pListNode.val<=qListNode.val)
{
tListNode.val=pListNode.val;
pListNode=pListNode.next;
}
else {
tListNode.val=qListNode.val;
qListNode=qListNode.next;
}
tListNode.next=new ListNode(0);
tListNode=tListNode.next;
}
while(pListNode!=null)
{
tListNode.val=pListNode.val;
pListNode=pListNode.next;
if(pListNode!=null)
{
tListNode.next=new ListNode(0);
tListNode=tListNode.next;
}
}
while(qListNode!=null)
{
tListNode.val=qListNode.val;
qListNode=qListNode.next;
if(qListNode!=null)
{
tListNode.next=new ListNode(0);
tListNode=tListNode.next;
}
}
return root;
}
}