合并两个有序的链表
因为提供的是有序的链表,所以只需要按顺序的一一分别对比两个链表的各个节点,如下图
代码如下:
var mergeTwoLists = function(l1, l2) {
let result = new ListNode(0)
let pre = result
while( l1 !== null && l2 !== null){
if( l1.val < l2.val){
pre.next = l1
l1 = l1.next
}else{
pre.next = l2
l2 = l2.next
}
pre = pre.next
}
// 如上图中,最后C链表还没有完全合并两个链表的节点就退出了循环,所以还需要判断最后哪个链表的节点还没为null
pre.next = l1 === null ? l2 : l1
return result.next
}
合并K个有序链表
解法:1:与合并两个有序链表的解法可以是一样的,代码如下:
var mergeKLists = function(lists) {
let res = null;
for(let i = 0; i < lists.length; i++){
// 循环K个链表 依次进行两个链表的合并
res = mergeTwoKLists(res,lists[i])
}
return res
};
var mergeTwoKLists = (head1,head2)=>{
let dummy = new ListNode(0),cur = dummy;
while(head1 !== null && head2 !== null){
if(head1.val < head2.val){
cur.next = head1
head1 = head1.next
}else{
cur.next = head2
head2 = head2.next
}
cur = cur.next
}
cur.next = head2 || head1
return dummy.next
}
解法2:K个链表的数据形式是一个二维数组,那就可以将数组扁平化之后取得每个链表中节点的val值,添加到新的数组中进行排序,最后在转换成链表中的节点输出
var mergeKLists = function(lists) {
let arr = []
for(let i = 0; i < lists.length; i++){
while(lists[i]){
arr.push(lists[i].val)
lists[i] = lists[i].next
}
}
arr.sort((a,b)=>a-b)
let dummy = new ListNode(0),cur = dummy;
for(let i=0; i < arr.length; i++){
cur.next = new ListNode(arr[i])
cur = cur.next
}
return dummy.next
};