LeetCode题目
合并 k 个排序链表,返回合并后的排序链表。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
算法思想
1.先考虑一个单链表和两个单链表合并的情况
2.将整个单链表数组每次从中间分割,直至每个数组里有一个或两个单链表,然后合并(分治)
3.写出两个单链表合并的算法
Java代码
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length == 0)
return null;
if(lists.length == 1)
return lists[0];
if(lists.length == 2){
return mergeTwoLists(lists[0],lists[1]);
}
int mid = lists.length/2;
ListNode[] l1 = new ListNode[mid];
for(int i = 0; i < mid; i++){
l1[i] = lists[i];
}
ListNode[] l2 = new ListNode[lists.length-mid];
for(int i = mid,j=0; i < lists.length; i++,j++){
l2[j] = lists[i];
}
return mergeTwoLists(mergeKLists(l1),mergeKLists(l2));
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode node = new ListNode(-1);
ListNode tmp=node;
while(l1!=null&&l2!=null){
if (l1.val<l2.val){
tmp.next = l1;
l1=l1.next;
tmp=tmp.next;
} else {
tmp.next=l2;
l2=l2.next;
tmp=tmp.next;
}
}
if(l1!=null){
tmp.next=l1;
l1=l1.next;
}
if(l2!=null){
tmp.next=l2;
l2=l2.next;
}
return node.next;
}
}