/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
auto dummy = new ListNode(-1),cur = dummy;
//dummy为和的头节点,cur为和的尾节点
int t = 0; //进位
while(l1 || l2 || t){ //l1没循环完或者l2没循环完或者进位不为0
if(l1) t+=l1->val, l1 = l1->next; //当l1没循环完,赋值给t,然后取下一位
if(l2) t+=l2->val, l2 = l2->next; //当l2没循环完,赋值给t,然后取下一位
cur->next = new ListNode(t % 10); //和的下一位等于t模10
cur = cur->next; //更新尾节点
t /= 10; //算进位
}
return dummy->next;
}
};
讲解:
- 定义虚拟头节点:dummy 节点,统一空链表和非空链表的插入操作
- t为进位量,两数相加,对十取模的数存到和节点,除十的数存到进位
- 判断:两个数有一个不为空,或者进位不为零
- 当任意一个加数不为空时,将数值加到t,并且取下一个,然后循环
- cur = cur->next 更新尾节点