1.题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
2. 代码
- 定义一个可随时增加的ListNode方法: (前提是struct中已经定义了该构造函数)
ListNode *newListNode = new ListNode(n);
curr -> next = new ListNode(m)
- 细节问题需要注意:
1》最后返回的是newListNode->next; 因为返回的依然是倒序
2》核心是sum+=count后创建新的ListNode的空间开辟 和 carry位的更新。 sum的重新定义为0
3》最后别忘了万一出现新的进位时,carry = 1,再开辟新的
4》p和q分开来加!!!!!!!!!!!!!!!!!!!!!!!!
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//第一步: 初始化数据
ListNode* newListNode = new ListNode(-1);;
ListNode* p = l1, *q = l2, *curr = newListNode;
int carry = 0, sum = 0;
//第二步: 通过逐位相加来得到结果
while((q != NULL) || (p != NULL)) {
sum = 0; //最重要的!!!!
if( p != NULL ) {
sum += p->val;
p = p-> next;
}
if( q != NULL ) {
sum += q->val;
q = q -> next;
}
sum += carry;
curr -> next = new ListNode(sum%10);
curr = curr -> next;
carry = sum >= 10 ? 1 : 0; //是 >= 等于号别忘了
}
if (carry == 1) {
curr -> next = new ListNode(1);
}
return newListNode->next; //输出的不是curr的next
}
};