有人可以解释以下链表片段

Can someone explain the following snippet of linked list

我对 while 循环中代码的最后三行感到困惑。我们基本上要return链表求和

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int sum=0;
        ListNode *l3 = NULL;
        ListNode **node = &l3;
        
        while(l1 != NULL || l2 != NULL || sum>0)
        {
            if(l1!=NULL)
            {
                sum+=l1->val;
                l1=l1->next;
            }
            if(l2!=NULL)
            {
                sum +=l2->val;
                l2=l2->next;
            }
            (*node) = new ListNode(sum%10);
            sum /= 10;
            node = &((*node) -> next); 
        }
        return l3;
    }

此函数创建一个新的链表,该链表将包含作为参数传递给函数的另外两个列表的数字(数字)之和。

因此,例如,如果传递的两个列表包含以下数据:

2 -> 4 -> 6 -> null
3 -> 5 -> 7 -> 9 -> null 

(即第一个列表包含数字 642 的表示,第二个列表包含数字 9753 的表示;每个节点包含给定数字的一个数字)然后结果列表将等于:

5 -> 9 -> 3 -> 0 -> 1 -> null

即结果列表将包含数字 10395,它等于数字 6429753.

的总和

函数returns指向新链表头节点的指针。也就是说,相对于上面显示的示例,函数 returns 指向包含 5.

的节点的指针

函数应该这样声明:

ListNode* addTwoNumbers( const ListNode* l1, const ListNode* l2);

因为传入的列表在函数内没有改变。

该函数正在创建一个新的链表,其中包含从 2 个其他链表计算得出的值。 l3 变量指向新列表的头部。在进入循环之前,node变量被设置为指向l3变量的内存地址。

在第一次循环迭代中,语句 (*node) = new ListNode(sum%10); 创建一个新的 ListNode 对象并将其分配给 node 指向的 ListNode* 变量,即l3。然后语句 node = &((*node) -> next); 设置 node 指向新创建的 ListNode 对象的 next 成员的内存地址。

在第 2 次循环迭代中,语句 (*node) = new ListNode(sum%10); 创建一个新的 ListNode 对象并将其分配给 node 指向的 ListNode* 变量,即先前创建的 ListNode 对象的 next 成员。然后语句 node = &((*node) -> next); 设置 node 指向新创建的 ListNode 对象的 next 成员的内存地址。

依此类推,直到没有更多的ListNode对象可创建时循环结束。然后函数 returns l3.

指向的新列表

上面的代码片段是求数字的总和。 假设您想添加 4385 和 8394。

添加它们的步骤是:

5+4=9 which is rightmost digit
8+9=17, so 7 is the next left digit and 1 carried over
3+3+1=7 which is next left digit
4+8=12 which is leftmost pair of digit

答案是 12779

您的代码只是在复制相同的程序,选择要写入某个位置的数字由 sum%10 完成,而结转的内容由 [=19= 完成]总和/=10。最后,整个答案由创建 l3 的最后一行编织而成。