问题描述
我对while循环中的代码的最后三行感到困惑。我们基本上必须返回链表的总和。
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
的总和。
该函数返回一个指向新列表头节点的指针。也就是说,相对于上面显示的示例,该函数返回一个指向包含5
的节点的指针。
该函数应声明为:
ListNode* addTwoNumbers( const ListNode* l1,const ListNode* l2);
因为传入的列表在函数中未更改。
,该函数正在创建一个新的链表,其中包含从其他2个链表中计算出的值。新列表的开头由l3
变量指向。在进入循环之前,将node
变量设置为指向l3
变量的内存地址。
在第一个循环迭代中,语句(*node) = new ListNode(sum%10);
创建一个新的ListNode
对象,并将其分配给ListNode*
所指向的node
变量,即{{ 1}}。然后,语句l3
设置node = &((*node) -> next);
指向该新创建的node
对象的next
成员的内存地址。
在第二个循环迭代中,语句ListNode
创建一个新的(*node) = new ListNode(sum%10);
对象,并将其分配给ListNode
所指向的ListNode*
变量,即{先前创建的node
对象的{1}}个成员。然后,语句next
设置ListNode
指向该新创建的node = &((*node) -> next);
对象的node
成员的内存地址。
以此类推,直到没有更多next
对象可创建的循环结束为止。然后,该函数返回由ListNode
指向的新列表。
上面的代码段是查找数字总和。 假设您要添加4385和8394。
添加它们的步骤如下:
5 + 4 = 9 这是最右边的数字
8 + 9 = 17,所以7是左下一位,1结转了
3 + 3 + 1 = 7 左下一位
4 + 8 = 12 这是最左边的数字对
答案是12779
您的代码只是复制了相同的过程,选择要写在某个位置的数字是由 sum%10 完成的,而结转的内容是由 sum / = 10