C# 为什么我们需要创建第二个对象 公共类解决方案{ 公共ListNode合并列表(ListNode a、ListNode b){ ListNode结果=新ListNode(-1); ListNode当前=结果; listnodel1=a; listnodel2=b; while(l1!=null&&l2!=null){ if(l1.val

C# 为什么我们需要创建第二个对象 公共类解决方案{ 公共ListNode合并列表(ListNode a、ListNode b){ ListNode结果=新ListNode(-1); ListNode当前=结果; listnodel1=a; listnodel2=b; while(l1!=null&&l2!=null){ if(l1.val,c#,linked-list,C#,Linked List,嗨,我正在处理一个leetcode问题,合并两个链表,这是我在disoss部分找到的一个解决方案,它是有效的,但我不明白为什么我们需要创建第二个对象并将第一个对象分配给第二个对象来完成工作,当我使用result.next direcly时,它不起作用,因为result是对列表开头的引用,而current总是在末尾(因为它是在每个步骤添加新元素的地方) 如果使用列表而不是节点,则不需要另一个对象。你说得对,这个“结果”对象真的没用,你可以在这个例程结束时扔掉它。它使算法更简单/更快,并避免了更多的

嗨,我正在处理一个leetcode问题,合并两个链表,这是我在disoss部分找到的一个解决方案,它是有效的,但我不明白为什么我们需要创建第二个对象并将第一个对象分配给第二个对象来完成工作,当我使用result.next direcly时,它不起作用,因为result是对列表开头的引用,而current总是在末尾(因为它是在每个步骤添加新元素的地方)


如果使用列表而不是节点,则不需要另一个对象。

你说得对,这个“结果”对象真的没用,你可以在这个例程结束时扔掉它。它使算法更简单/更快,并避免了更多的测试。如果ListNode是一个结构,那么您不必担心。
新的ListNode
没有做任何实际的事情。如果这是一门课,我们可以再考虑一次,如果我们可以避免的话

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;
    }
}
ListNode当前;
listnodel1=a;
listnodel2=b;
ListNode结果;//这里我们保存前一个结果。下一个结果
如果(l1!=null&&l2!=null)
{
if(l1.val

这只是为了你的理解,看看其他的选择。此代码速度更快,因为它跳过了新的
(如果ListNode是一个类),但比您的代码长。

因为当前的实际上正在执行合并过程,最后它将位于结果列表的末尾,whileresult.next是需要返回的结果列表的真正标题。

I这就是为什么排序时需要一个临时变量的原因。当你排序交换两个项目时,你会做temp=A,A=B,B=A。如果你只做A=B,你会失去A的值。@jdweng temp我理解,但这里如果我使用result.next,它不起作用,它是一个链表,对吧,result.next是指下一个
    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;