我不明白这个 LeetCode 问题解决方案

时间:2021-07-13 09:09:09

标签: javascript

合并两个已排序的链表并将其作为排序列表返回。该列表应通过将前两个列表的节点拼接在一起来制作。下面的例子。

<块引用>

输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]

<块引用>

输入:l1 = [], l2 = [] 输出:[]

<块引用>

输入:l1 = [], l2 = [0] 输出:[0]

这是我的解决方案:

var mergeTwoLists = function(l1, l2) {
  if(!l1 || !l2) return (l1? l1:l2);
  if(l1.val < l2.val) {
    l1.next = mergeTwoLists(l1.next, l2);
    return l1;
  } else {
    l2.next = mergeTwoLists(l1, l2.next);
    return l2;
  }
};

有人可以逐行解释这个解决方案吗?非常感谢!

2 个答案:

答案 0 :(得分:1)

这是一种递归方法。所以首先你需要一个基本情况来确保它能够在某个时候停止。

这里,这是第一个条件(如果缺少一个参数,则返回另一个)。请注意,即使最初使用一个空列表调用该函数,这也有效,因此这似乎是相关的。

然后基本上它会检查哪个列表的第一个元素最低(这是正确的想法:两者中的最低值应该首先进入结果)。

在此之后,您刚刚保留的元素将被添加相同函数的结果减去您刚刚选择的项目(因为它现在是第一个元素)。

这是一个例子

1 -> 5 -> 10
3 -> 4 -> 9 -> 11

然后这个想法是说“结果应该从 1 或 3 开始,然后是排序列表的其余部分”。所以你选择最低的一个:

Result: 1

5 -> 10
3 -> 4 -> 9 -> 11

然后您可以重复该过程,只需调用剩余列表上的函数并将新值附加到您的结果中(因此您必须在 5 和 3 之间进行选择):

Result: 1 -> 3

5 -> 10
4 -> 9 -> 11

然后重复直到只剩下一个列表:

Result: 1 -> 3 -> 4 -> 5 -> 9 -> 10

11

在这里你可以完全附加最后一个列表(这里只有一个元素,但即使有更多元素也能工作)。

我希望我已经足够清楚:)

答案 1 :(得分:1)

首先,l1l2 作为链接列表对象传递。它们不是数组。

if (!l1 || !l2) return l1 ? l1 : l2; 如果其中之一为空,则返回一个列表。

l1.next = mergeTwoLists(l1.next, l2) 这是一个递归调用,它将下一个点分配给来自其他两个列表 l1.nextl2 的合并列表。

l2.next = mergeTwoLists(l1, l2.next)也是同样的逻辑。

因此,最终的结果将是下一个节点的所有合并列表的合并列表。

var mergeTwoLists = function (l1, l2) {  
  if (!l1 || !l2) return l1 ? l1 : l2; //return one list if one of them is null
  if (l1.val < l2.val) {
    l1.next = mergeTwoLists(l1.next, l2); //return the merged List from the two input list
    return l1;
  } else {
    l2.next = mergeTwoLists(l1, l2.next); //return the merged List from the two input list
    return l2;
  }
};