不要想复杂 把需要插入的值各自求出 再用尾插法插入新的链表就好
整体思路:
每次计算包含了本位和进位,首先求出sum,由l1的节点val1、l2的节点val2以及上一位的进位carry决定:sum = val1 + val2 + carry
本位cur = sum % 10 进位carry = sum / 10;
将本位存入链表
重复以上步骤,直到两个链表均为空,如果此时进位不为0,那么就多插入一位作为两数之和的首位(链表末位)
返回值
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// 已经有l1,l2就不要搞p1,p2这种奇怪的标志
ListNode *head = new ListNode(0);
ListNode *cur = NULL;
cur = head;
int sum = 0, carry = 0;
// sum是两位数加上上一个进位的和 carry是进位
while(l1 || l2){
sum = carry; // 如果上一位有进位 先算上carry的值
if(l1){
sum += l1->val;
l1 = l1->next;
}// 如果l1不为空,将sum加l1的值
if(l2){
sum += l2->val;
l2 = l2->next;
}// 同上
// 求和结束 将对应的数字放入对应的位置
carry = sum / 10;
cur->next = new ListNode(sum % 10);
cur = cur->next;
// 尾插法
}
// 插入最后一个后 发现进位不为零(需要多加一位时)就再插入一位
if(carry != 0){
cur->next = new ListNode(carry);
cur = cur->next;
}
return head->next;
}
};