核心思想: 固定一个较长的链表
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse orderand each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
/* 链表实现大数相加
* 这里给定的是逆序的 开头是个位 因此从开头相加就可以了 加完后的结果存在l1中
* 假设l1 长度大于 l2 如果不是就进行交换
* 加完之后的情况: l1 l2 都遍历完(不用管)
* l1 尚未遍历完(继续对l1 + carry进行运算)
* 然后可能情况: 最后发生了进位 (要新建一个值为1的节点挂在最后 因此需要一个pre来记录l1当前前驱)
* 最后没有发生进位 结束
*
* */
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// len(l1) >= len(l2) else swap them
int len1=0, len2=0;
for(ListNode *head = l1;head != NULL; head = head->next) len1++;
for(ListNode *head = l2;head != NULL; head = head->next) len2++;
if(len1 < len2){
swap(len1, len2);
swap(l1, l2);
}
ListNode *ret = l1, *l1pre;
int carry = 0;
while(l1 && l2){
int tmp = carry + l1->val + l2->val;
carry = tmp/10;
l1->val = tmp % 10;
l1pre = l1;
l1 = l1->next;
l2 = l2->next;
}
if(l1 && !l2) {
while (l1) {
int tmp = carry + l1->val;
carry = tmp / 10;
l1->val = tmp % 10;
l1pre = l1;
l1 = l1->next;
}
}
if(carry == 1){
ListNode *tmp = new ListNode(1);
l1pre->next = tmp;
tmp->next = NULL;
}
return ret;
}
};