合并两个已排序的链表并将其作为排序列表返回。该列表应通过将前两个列表的节点拼接在一起来制作。下面的例子。
<块引用>输入: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;
}
};
有人可以逐行解释这个解决方案吗?非常感谢!
答案 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)
首先,l1
和 l2
作为链接列表对象传递。它们不是数组。
if (!l1 || !l2) return l1 ? l1 : l2;
如果其中之一为空,则返回一个列表。
l1.next = mergeTwoLists(l1.next, l2)
这是一个递归调用,它将下一个点分配给来自其他两个列表 l1.next
和 l2
的合并列表。
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;
}
};