给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
本题有很多解法,下面是自己想的比较yu的解法,仅供参考,有可以改进的地方希望大家指出来多多交流。
/**
* 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) {
int car = 0;
int v = 0;
ListNode* p = l1;//新建一个节点保存l1的位置
while(l1->next && l2->next){ //计算l1和l2的公共部分,除了公共部分的最后一位数;保存在l1中
v = l1->val + l2->val + car;
l1->val = v%10;
car = v/10;
l1 = l1->next;
l2 = l2->next;
}
v = l1->val + l2->val + car; //计算公共部分的最后一位数,并保存在l1中
l1->val = v%10;
car = v/10;
if(l2->next) l1->next = l2->next; //如果l2比l1长,则把l2比l1长的那部分接到l1后面
l1=l1->next;
while(l1){ //计算只剩l1情况下的l1和进位
v = l1->val + car;
l1->val = v%10;
car = v/10;
l1 = l1->next;
}
if(car){ //如果上面计算完进位car不为0,则在l1后面加个值为1的节点
ListNode* q = p;
while(q->next) q = q->next;
ListNode* w = new ListNode(1);
q->next = w;
}
return p;
}
};