有人可以解释以下链表片段
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
,它等于数字 642
和 9753
.
的总和
函数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 的最后一行编织而成。
我对 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
,它等于数字 642
和 9753
.
函数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 的最后一行编织而成。