给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4
题解:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode listNode = null;
//以行作为循环条件,每一个都进行便利
for (int i = 0; i <lists.length ; ++i) {
listNode=add(listNode,lists[i]);
}
//返回最终的数据,按排序的方式
return listNode;
}
//第一个参数用于存储数据,第二参数传入对应需要排序的数据
public ListNode add(ListNode listNode,ListNode lists){
//判断返回链表或者传入链表中是否为空,如果为空,进行对应的赋值
if(listNode==null || lists==null) {
return listNode !=null? listNode: lists;
}
//建立一个空的链表
ListNode pre=new ListNode(0);
//将链表与tail进行共用,将输出链表和输入链表赋值给listNode1,listNode2
ListNode tail=pre,listNode1=listNode,listNode2=lists;
//确保两个链表均存在数据,才能进行循环
while (listNode1!=null && listNode2!=null){
//如果输入链表中的数据与输出数据进行比较将小的值赋值给新链表,并且将对应链表进行移动到下一位
if(listNode1.val<listNode2.val){
tail.next=listNode1;
listNode1=listNode1.next;
}else{
tail.next=listNode2;
listNode2=listNode2.next;
}
//将新的链表移动下一位
tail=tail.next;
}
//判断链表其中一个是否为空,将其余剩下的那个链表将值赋给新的链表
tail.next=(listNode1 !=null ? listNode1 : listNode2);
return pre.next;
}
}