一、题目
二、思路
由于输入的两个链表都是逆序存储数字的每一位,所以两个链表中同一个位置的数字可以直接相加,同时遍历两个链表,逐位计算两个结点的数值之和,同时当前两个结点的数值之和还要加上来自低位的进位(因为逆序存储,所以低位就是两个链表的当前节点的前一个结点相加产生的进位),即设两个结点的当前节点分别为n1和n2,前一位的进位为carry,当前的和为n1+n2+carry,对应答案链表应该放的值为(n1+n2+carry)mod 10,新的进位值为(n1+n2+carry) / 10。
如果两个链表长度不同,可以认为长度短的链表后面有若干个0(短的说明高位为0,就是链表后面为0)。
当遍历结束后发现carry仍然大于0,说明最高位相加时产生了进位,将这个进位值直接加在答案链表后面即可。
三、代码实现
/**
* 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) {
ListNode *head = nullptr, *tail = nullptr;
int carry = 0;
while(l1 || l2) {
//如果结点值为空 将n1或者n2设置为0 对sum无影响
int n1 = l1 ? l1 -> val : 0;
int n2 = l2 ? l2 -> val : 0;
int sum = n1 + n2 + carry;
if(!head) {
//当头结点为空 说明当前这个数字是头结点的值 赋值 同时将tail初始化为头结点的值
head = tail = new ListNode(sum % 10);
} else {
tail -> next = new ListNode(sum % 10);
tail = tail -> next;
}
//计算进位
carry = sum / 10;
if(l1) {
l1 = l1 -> next;
}
if(l2) {
l2 = l2 -> next;
}
}
if(carry > 0) {
//如果最高位产生进位 将进位放在答案链表末尾 表示答案的最高位的数值
tail -> next = new ListNode(carry);
}
return head;
}
};