合并n个链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
public static ListNode mergeKLists(ListNode[] lists){ int count=lists.length/2+lists.length%2; if(count==0){ return null; } ListNode[] newLists=new ListNode[count]; for(int i=0;i<lists.length;i=i+2){ if(lists.length<=i+1){ newLists[count-1]=lists[i]; break; } newLists[i/2]=mergeTwoLists(lists[i],lists[i+1]); } if(newLists.length>1){ return mergeKLists(newLists); } return newLists.length==0?null:newLists[0]; }
public static ListNode mergeTwoLists(ListNode l1,ListNode l2){ ListNode dumb=new ListNode(0); ListNode head=dumb; while (l1!=null&&l2!=null){ if(l1.val<l2.val){ dumb.next=l1; l1=l1.next; }else{ dumb.next=l2; l2=l2.next; } dumb=dumb.next; } dumb.next=(l1==null?l2:l1); return head.next; }
思路:
1.集合里的链表2个合并在一起放入新的集合中。
2.新集合的大小为 原集合大小整除2加上原集合大小整除2取模。
3.将新集合递归调用,当新集合里的元素只有1个时即为结果返回即可。