描述
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
数据范围:节点总数满足 0 \le n \le 10^50≤n≤105,链表个数满足 1 \le k \le 10^5 \1≤k≤105 ,每个链表的长度满足 1 \le len \le 200 \1≤len≤200 ,每个节点的值满足 |val| <= 1000∣val∣<=1000
要求:时间复杂度 O(nlogk)O(nlogk)
示例1
输入:
[{1,2,3},{4,5,6,7}]
复制返回值:
{1,2,3,4,5,6,7}
复制
示例2
输入:
[{1,2},{1,4,5},{6}]
复制返回值:
{1,1,2,4,5,6}
思路:两两合并思想
import java.util.*;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
if(lists==null || lists.size()==0) {
return null;
}
while(lists.size()>1) {
ArrayList<ListNode> newList = new ArrayList<ListNode>();
for(int i=0;i+1<lists.size();i+=2) {
ListNode listnode = merge(lists.get(i),lists.get(i+1));
newList.add(listnode);
}
//如果是奇数,将最后一个链表添加到新的集合中
if(lists.size()%2!=0) {
newList.add(lists.get(lists.size()-1));
}
lists = newList;
}
return lists.get(0);
}
public ListNode merge(ListNode l1,ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode p = dummy;
while(l1!=null && l2!=null) {
if(l1.val<l2.val) {
p.next = l1;
p = l1;
l1 = l1.next;
}else {
p.next = l2;
p = l2;
l2 = l2.next;
}
}
if(l1!=null) {
p.next = l1;
}
if(l2!=null) {
p.next = l2;
}
return dummy.next;
}
}