Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在这里初始化ListNode两次?_Java_Data Structures_Linked List - Fatal编程技术网

Java 为什么在这里初始化ListNode两次?

Java 为什么在这里初始化ListNode两次?,java,data-structures,linked-list,Java,Data Structures,Linked List,问题:给您两个非空链表,表示两个非负整数。数字按相反顺序存储,每个节点包含一个数字。将这两个数字相加,并将其作为链表返回 您可以假设这两个数字不包含任何前导零,除了数字0本身 下面是我用JAVA解决这个问题的方法: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; }

问题:给您两个非空链表,表示两个非负整数。数字按相反顺序存储,每个节点包含一个数字。将这两个数字相加,并将其作为链表返回

您可以假设这两个数字不包含任何前导零,除了数字0本身

下面是我用JAVA解决这个问题的方法:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode l3 = dummy;
        int carry = 0;

        while(l1 != null && l2 != null){
            int digitValue = (l1.val + l2.val + carry)%10;
            carry = (l1.val + l2.val + carry)/10;

            ListNode newNode = new ListNode(digitValue);

            l3.next = newNode;
            l3 = newNode;

            l2 = l2.next;
            l1 = l1.next;
        }

        while(l1 != null){
            int digitValue = (l1.val + carry)%10;
            carry = (l1.val + carry)/10;

            ListNode newNode = new ListNode(digitValue);

            l3.next = newNode;
            l3 = newNode;

            l1 = l1.next;
        }

        while(l2 != null){
            int digitValue = (l2.val + carry)%10;
            carry = (l2.val + carry)/10;

            ListNode newNode = new ListNode(digitValue);

            l3.next = newNode;
            l3 = newNode;

            l2 = l2.next;
        }

        if(carry != 0 ){
            ListNode newNode = new ListNode(carry);
            l3.next = newNode;
            l3 = newNode;
        }

        return dummy.next;
    }
}
然而,为什么代码必须是

ListNode dummy = new ListNode(0);
ListNode l3 = dummy;

,而不仅仅是:“listNode l3=新的listNode(0);”我知道这是错误的。如果我使用此代码,我的答案将返回“[]”。我不明白为什么会发生这种情况?

只是您需要保留返回结果的标题,以便我们可以打印它。如果您喜欢“listNode l3=new listNode(0);”,并更新l3的引用,则函数末尾的l3是列表的尾部

这里要做的是创建一个虚拟节点引用作为链接列表的头部,并创建另一个引用l3来修改列表

ListNode dummy = new ListNode(0);
ListNode l3 = dummy;

你只需要拿着你需要返回的结果的标题,这样我们就可以打印出来。如果您喜欢“listNode l3=new listNode(0);”,并更新l3的引用,则函数末尾的l3是列表的尾部

这里要做的是创建一个虚拟节点引用作为链接列表的头部,并创建另一个引用l3来修改列表

ListNode dummy = new ListNode(0);
ListNode l3 = dummy;

您的返回值为dummy.next。如果你淘汰了dummy,你会得到什么回报?下一个?l3将在代码中重新分配。返回值为dummy.next。如果你淘汰了dummy,你会得到什么回报?下一个?l3将在代码中重新分配。