【问题标题】:Why we need to create second object为什么我们需要创建第二个对象
【发布时间】:2019-12-15 13:18:55
【问题描述】:
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 时它不起作用

【问题讨论】:

  • 我和你排序的原因是一样的,你需要一个临时变量。当你排序交换两个项目时,你会做 temp = A,A = B,B = A。如果你只是做 A = B,你会失去 A 的价值。
  • @jdweng temp 我明白了,但是在这里如果我使用 result.next 代替它不起作用,它是一个链表,result.next 表示下一个

标签: c# linked-list


【解决方案1】:

因为 result 是对列表开头的引用,而 current 总是在末尾(因为它是每一步添加新元素的地方)。

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

【讨论】:

    【解决方案2】:

    你是对的,这个“结果”对象真的没用,你在这个例程结束时把它扔掉。它使算法更简单/更快,并避免了更多的测试。如果 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 是一个类),但比您的代码长。

    【讨论】:

      【解决方案3】:

      因为current其实是在做合并过程,最后会在结果列表的最后,而result.next是需要返回的结果列表的真正头部。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 2019-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多