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

这样做会直接破坏原有的l1l2,不过题目中是允许的。

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节点,一下子回避了很多问题。

比如说,开始的节点留哪个?是不是要l1l2做个判断,留一开始最小的那个。那样思路的话就一下子变得很复杂了。

还有把指针直接贴上去的做法也是,我是想着根据val自己生成一个节点,然后把节点贴上去。其实可以直接贴上去的。。

探险过程

思路是这样的,拿来的两个链表,一个个摸出val,然后比大小。小的放前面,大的放后面,然后塞到之前的链表后面

然后就发现了问题,赋值之后把l1的值给改变了

image-20190703214528102

发现是第5行的缘故。

第3行当中,是吧result这个变量,指向l1这个地址。因此5行result.next调用的是l1.next这个内容。因此是在把l2的值,覆盖掉l1.next了。

因此直接塞入链表不可行,得拿出每个节点的val,然后自己生成一个链表才行

然后做不出来了。。

测试代码

测试代码主要解决两件事:

  1. 根据数组,搭建链表。然后才能把链表传进函数mergeTwoLists里面 搭建链表的方法(Lists),仿照two sum的测试代码中的BST函数

  2. mergeTwoLists得出的结果是链表,需要判断两个链表是否一致 判断结果的方法(ensure),就是从头到尾一个个val进行判断

优化一下List

感觉之前的逻辑太复杂了,存一下之前的节点就行了。毕竟都是引用的,肯定能找到。

感觉一下子少了很多代码

一个有趣的发现

如果在这里面打印会发现:

image-20190703202315846

List打印出来的nextnull,然而打开它,还是能找到next的节点。

可能这是因为,console.log的时候,生成了一个快照。而点开的时候也调用了一下这个地址引用的内容,因此会出现结果的冲突。

pre也是类似,它的作用是存一下最新节点的变量。可以发现,它每次都指向了新的地址,里面有新的节点。

console.log()输出时是同步还是异步的问题

类似于如下的这个例子:

image-20190703205302721

解决方法,是console.log(JSON.stringify(a))强行转成字符串,就可以不怕更改了

当然这就需要多写一堆字,可以在vsc里面设置用户代码片段

Last updated

Was this helpful?