持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
力扣100——合并两个有序的链表
题目
刷完100道力扣题之合并两个链表。这在力扣上面是一道简单题,题目大概是需要我们合并两个链表,每个链表自身是按照升序来排列的。我们合并之后返回一个链表,是之前两个链表的合并,并且也是按照升序排列。
思路
写这道题目,我们首先闹钟首先闪过的是排序算法,简单粗暴的方法就是将两个链表合并在一起,然后再对链表进行升序排序。但是这样的时间复杂度显而易见会很高,我们需要对其进行优化。我们知道,能用迭代的我们都可以使用递归来解决,这里我们需要使用的就是递归。
递归首先需要设定递归的结束条件,如果没有递归条件,我们的递归将会递归地狱。我们知道,链表的最后一个next
指向null
,因此我们需要在递归到最后一个链表节点的时候退出递归。
//当list1为null的时候,表示list1已经递归完成了,我们需要返回list2
if(list1 === null){
return list2;
}
//当list2为null的时候,表示list2已经递归完成了,我们需要返回list1
if(list2 === null){
return list1;
}
上面我们对两个链表进行了判断,当list1
为null
的时候,表示list1
已经被迭代完成了,接下来我们需要将list2
返回。同理,如果list2
为null
我们需要将list2
返回。
接下来我们要对list1
和list2
的val
进行对比。
首先,我们先找出最小的那个节点,因为两个链表都是升序排列,所以两个链表的第一个节点都是链表当中最小的节点。所以我们比较一下list1.val
和list2.val
//比较两个链表的节点大小
if(list1.val < list2.val){
//假如list1.val小于list2.val,那么我们可以得知链表的最小的一个节点为list1.val,之后我们再比较就只需要将结果放在这个节点之后就可以了
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}else{
//list2.val小于或等于list1.val,那么我们可以得知链表的最小的一个节点为list2.val,之后我们再比较就只需要将结果放在这个节点之后就可以了
list2.next = mergeTwoLists(list1,list2.next);
return list2;
}
之后,我们通过递归所有的链表节点就可以得到一个升序的链表了。
实现
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function(list1, list2) {
if(list1 === null){
return list2;
}
if(list2 === null){
return list1;
}
//判断val的大小
if(list1.val < list2.val){
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}else{
list2.next = mergeTwoLists(list1,list2.next);
return list2;
}
};
const list1 = {
val:1,
next:{
val:2,
next:{
val:3,
next:null,
}
}
}
const list2 = {
val:1,
next:{
val:5,
next:{
val:7,
next:null,
}
}
}
console.log(mergeTwoLists(list1,list2));