为什么我们需要创建第二个对象

时间:2019-12-15 13:18:55

标签: c# linked-list

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问题,这是我在讨论部分中找到的解决方案,它可以工作,但是我不明白为什么我们需要创建第二个对象并将第一个对象分配给秒完成工作,当我使用result.next时

3 个答案:

答案 0 :(得分:0)

因为结果是对列表开头的引用,而当前总是在结尾(因为它是在每个步骤添加新元素的地方)。

如果使用列表而不是节点,则不需要其他对象。

答案 1 :(得分:0)

您是对的,这个“结果”对象确实没有用,您在此例程结束时将其丢弃。它使算法更简单/更快,并且避免了更多测试。如果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是一个类),但是比您的代码更长。

答案 2 :(得分:0)

因为 current 实际上正在执行合并过程,最后它将在结果列表的末尾,而 result.next < / em> 是需要返回的结果列表的真实标题。