10 - 合并两个有序链表
题目
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
解答
递归
作者:guanpengchn 链接:https://leetcode-cn.com/problems/two-sum/solution/hua-jie-suan-fa-21-he-bing-liang-ge-you-xu-lian-bi/
思路是,一个个拿出来比对,如果遇到小的,就往它的next后面贴链表。不断重复这个过程,直至遇到了null
这样做会直接破坏原有的l1或l2,不过题目中是允许的。
var mergeTwoLists = function(l1, l2) {
if(l1 === null){
return l2;
}
if(l2 === null){
return l1;
}
if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}else{
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
};Runtime: 68 ms, faster than 66.67% of JavaScript online submissions forMerge Two Sorted Lists.
Memory Usage: 35.2 MB, less than 90.02% of JavaScript online submissions for Merge Two Sorted Lists.
指针
指针的思路是,做一个-1节点,再有一个指针,指向最新的那个节点。
然后跑循环,每次比对小的那个贴到指针节点的后面。最后输出开头-1节点的后面那个节点。
Runtime: 72 ms, faster than 31.06% of JavaScript online submissions for Merge Two Sorted Lists.
Memory Usage: 34.9 MB, less than 99.94% of JavaScript online submissions for Merge Two Sorted Lists.
感觉这种思路,和我的思路很像,但要好很多。这里用了一个-1节点,一下子回避了很多问题。
比如说,开始的节点留哪个?是不是要l1和l2做个判断,留一开始最小的那个。那样思路的话就一下子变得很复杂了。
还有把指针直接贴上去的做法也是,我是想着根据val自己生成一个节点,然后把节点贴上去。其实可以直接贴上去的。。
探险过程
思路是这样的,拿来的两个链表,一个个摸出val,然后比大小。小的放前面,大的放后面,然后塞到之前的链表后面
然后就发现了问题,赋值之后把l1的值给改变了

发现是第5行的缘故。
第3行当中,是吧result这个变量,指向l1这个地址。因此5行result.next调用的是l1.next这个内容。因此是在把l2的值,覆盖掉l1.next了。
因此直接塞入链表不可行,得拿出每个节点的val,然后自己生成一个链表才行
然后做不出来了。。
测试代码
测试代码主要解决两件事:
根据数组,搭建链表。然后才能把链表传进函数
mergeTwoLists里面 搭建链表的方法(Lists),仿照two sum的测试代码中的BST函数mergeTwoLists得出的结果是链表,需要判断两个链表是否一致 判断结果的方法(ensure),就是从头到尾一个个val进行判断
优化一下List
感觉之前的逻辑太复杂了,存一下之前的节点就行了。毕竟都是引用的,肯定能找到。
感觉一下子少了很多代码
一个有趣的发现
如果在这里面打印会发现:

List打印出来的next是null,然而打开它,还是能找到next的节点。
可能这是因为,console.log的时候,生成了一个快照。而点开的时候也调用了一下这个地址引用的内容,因此会出现结果的冲突。
pre也是类似,它的作用是存一下最新节点的变量。可以发现,它每次都指向了新的地址,里面有新的节点。
类似于如下的这个例子:

解决方法,是console.log(JSON.stringify(a))强行转成字符串,就可以不怕更改了
当然这就需要多写一堆字,可以在vsc里面设置用户代码片段
Last updated
Was this helpful?