题目链接
思路
- 两个递归完成;
- 将数组合并为当前数组长度的一半或一半-1组成新数组递归调用:
- 获取数组长度;如果数组长度为0返回null;数组长度为1返回唯一的元素
- 判断当前长度是否是偶数;如果是奇数先将最后两个元素合并为一个元素
- 长度为偶数时除以2求出mid;对mid进行循环;
- 将第i和第i+mid个元素进行合并
- 然后将0到mid的元素组成一个新的数组进行递归调用
- 两两合并递归调用:
- 对两个ListNode分别判空,如果有空就返回另一个
- 比较两个ListNode的val;递归两两调用参数为:
- 较小的ListNode.next和另一参数本身;并return较小的ListNode
java
public ListNode mergeKLists(ListNode[] lists) {
int length = lists.length;
if (length == 0) {
return null;
}
if (length == 1) {
return lists[0];
}
if (length % 2 != 0) {
lists[length - 2] = merge2Node(lists[length - 1], lists[length - 2]);
length--;
}
int mid = length / 2;
ListNode[] param = new ListNode[mid];
for (int i = 0; i < mid; i++) {
lists[i] = merge2Node(lists[i], lists[i + mid]);
param[i] = lists[i];
}
return mergeKLists(param);
}
private ListNode merge2Node(ListNode a, ListNode b) {
if (a == null) {
return b;
}
if (b == null) {
return a;
}
if (a.val < b.val) {
a.next = merge2Node(a.next, b);
return a;
} else {
b.next = merge2Node(a, b.next);
return b;
}
}
go
func mergeKLists(lists []*ListNode) *ListNode {
length := len(lists)
if length == 0 {
return nil
}
if length == 1 {
return lists[0]
}
if length%2 != 0 {
lists[length-2] = merge2Node(lists[length-1], lists[length-2])
lists = lists[:length-1]
length--
}
mid := length / 2
for i := 0; i < mid; i++ {
lists[i] = merge2Node(lists[i], lists[i+mid])
}
return mergeKLists(lists[:mid])
}
func merge2Node(a, b *ListNode) *ListNode {
if a == nil {
return b
}
if b == nil {
return a
}
if a.Val < b.Val {
a.Next = merge2Node(a.Next, b)
return a
}
b.Next = merge2Node(a, b.Next)
return b
}