难度 ⭐⭐
🎀 题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
🍦示例
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
🏳🌈思路
既然是逆序的,那么正好符合我们计算加法时的规律。同时考虑进位即可。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* tmp1 = l1;
ListNode* tmp2 = l2;
ListNode* head = new ListNode(-1);
ListNode* tmp0 = head;
int carry = 0;
while(tmp1!=NULL && tmp2!=NULL){
int num1 = tmp1->val;
int num2 = tmp2->val;
int num = (num1+num2+carry)%10;
carry = (num1+num2+carry)/10;
tmp0->next= new ListNode(num);
tmp0 = tmp0->next;
tmp1 = tmp1->next;
tmp2 = tmp2->next;
}
ListNode* t;
if(tmp1 != NULL) t = tmp1; else t = tmp2;
while(t!=NULL){
int num1 = t->val;
int num = (num1+carry)%10;
carry = (num1+carry)/10;
tmp0->next = new ListNode(num);
tmp0 = tmp0->next;
t = t->next;
}
if(carry)
tmp0->next = new ListNode(1);
return head->next;
}
};
❕ 总结
- 在构造链表的时候,可以先构造一个头哨兵head, 它不存储任何数据,仅仅是一个哨兵而已。再让一个tmp = head, 每次都对tmp->next new出来一个节点,tmp不断变成tmp->next.
- 在计算进位时,别忘记应该先
int num = (num1+carry)%10
;再carry = (num1+carry)/10
;这个顺序不能混。