难度:困难 日期:2023年6月11日
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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 = [[]] 输出:[]
方法一:数组储存+排序
思路:将lists里面所有链表节点值存储在一个数组中,再根据数组内的值生成新的链表返回
var mergeKLists = function(lists) {
let arr = [];
for(let i = 0 ;i < lists.length;i++){
let head = lists[i];
while(head != null){
arr.push(head.val);
head = head.next;
}
}
arr.sort((a,b)=>a-b);
let list = new ListNode(0,null);
let cur = list;
for(let i = 0;i < arr.length;i++){
cur.next = new ListNode(arr[i],null);
cur = cur.next;
}
return list.next;
};
结果
方法二:顺序合并
思路:将前两个合并的结果,再去和第三个链表合并,以此类推,直到把lists中所有的链表合并
var mergeTowList = function(head1,head2){
if(head1 == null || head2==null){
return head1==null?head2 : head1;
}
let list = new ListNode(0,null);
let tail = list;
while(head1 != null && head2 != null){
if(head1.val < head2.val){
tail.next = head1;
head1 = head1.next
}else{
tail.next = head2;
head2 = head2.next
}
tail = tail.next;
}
tail.next = head1==null?head2:head1;
return list.next;
}
var mergeKLists = function(lists) {
let list = null;
for(let i = 0;i < lists.length;i++){
list = mergeTowList(list,lists[i]);
}
return list
};
结果