解法都在代码里,不懂就留言或者私信
这个解法不是最优解,但是面试应该够了,实在是时间有点紧没时间写了,最优解的原理跟这个差不多,过几天补充
public static ListNode mergeKLists(ListNode[] lists) {
if(lists == null || lists.length == 0) {
return null;
}
if(lists.length == 1) {
return lists[0];
}
/**大于1的情况下每次合并两个,然后拿结果和下一个合并,先把0位置的作为head*/
ListNode head = lists[0];
for(int i = 1; i < lists.length; i++) {
/**和上一步的结果合并完之后更新head*/
head = merge(head, lists[i]);
}
return head;
}
public static ListNode merge(ListNode l1, ListNode l2) {
/**排除两个都是空的,合并完还是空*/
if(l1 == null && l2 == null) {
return null;
}
/**一个为空返回另外一个*/
if(l1 == null || l2 == null) {
return l1 == null? l2 : l1;
}
/**都不为空的情况,先定一个一个遍历head用于存储最终的合并完的链表的头*/
ListNode head = null;
ListNode last = null;
/**如果两个链表都还不为空*/
while(l1 != null && l2 != null) {
/**每次选取最小的作为当前的节点*/
ListNode cur = l1.val <= l2.val? l1 : l2;
/**head只初始化一次,head为空,last必然为空*/
if(head == null) {
head = cur;
last = cur;
} else {
/**原来链表有节点,则把当前节点串到最后,当前作为最后一个节点*/
last.next = cur;
last = cur;
}
/**cur是谁谁跳下一个,否则不动*/
l1 = cur == l1? l1.next : l1;
l2 = cur == l2? l2.next : l2;
}
/**如果l1没有用完,把l1挂到last的后面即可*/
if(l1 != null) {
last.next = l1;
}
/**如果l2没有用完,把l2挂到last的后面即可*/
if(l2 != null) {
last.next = l2;
}
return head;
}