public class Solution {
public ListNode MergeTwoLists(ListNode a, ListNode b) {
ListNode result = new ListNode(-1);
ListNode current = result;
ListNode l1 = a;
ListNode l2 = b;
while(l1 != null && l2 != null) {
if(l1.val < l2.val) {
current.next = l1;
l1 = l1.next;
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next;
}
if(l1 != null) {
current.next = l1;
} else {
current.next = l2;
}
return result.next;
}
}
嗨,我正在处理合并两个链表的 leetcode 问题,这是我在 disuss 部分找到的解决方案,它有效,但我不明白为什么我们需要创建第二个对象并将第一个分配给第二个对象来完成工作,当我使用 result.next direcly
因为 result 是对列表开头的引用,而当前总是在末尾(因为它是每一步添加新元素的地方(。
如果使用列表而不是节点,则不需要其他对象。
你是对的,这个"结果"对象真的没用,你在这个例程结束时把它扔掉。它使算法更简单/更快,并避免了更多的测试。如果ListNode是一个结构体,那么你不必担心。new ListNode
没有做任何真正的事情。如果这是一个类,我们可以再想一想,如果我们能避免它。
ListNode current;
ListNode l1 = a;
ListNode l2 = b;
ListNode result; // here we save the former result.next as result
if (l1!=null && l2!=null)
{
if(l1.val < l2.val)
{
result = l1;
current = l1 = l1.next;
}
else
{
result = l2;
current = l2 = l2.next;
}
}
while ( ....)
{
/* unmodified */
}
return result;
这只是为了您的理解,看看替代方案。此代码更快,因为它跳过new
(在 ListNode 是一个类的情况下(,但比您的代码长。
因为current实际上是在做合并过程,最后它会在结果列表的末尾,而result.next是需要返回的结果列表的真正头部。