题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
思路:
1.相加的过程中可能存在进位的操作,所以需要采用一个变量carry来记录进位的情况,初始化carry = 0;
2.因为链表的数字是倒着放的,所以相加起来很方便,将两个链表从头到尾一起遍历,如果有值的话就将它们的值相加sum = val1+val2+carry。
3.如果是两个长度不一样的链表,则需要注意将不再继续向后,且让相应位的和为val1+0.
4.carry的更新,carry = sum/10, 而当前节点和 curr->val = sum%10.
5.循环直至l1,l2都为空。
6.遍历完之后如果carry == 1, 新建一个节点存在进位。
实现代码:
/** * 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) { ListNode *newHead = new ListNode(0); ListNode *p = l1; ListNode *q = l2; ListNode *curr = newHead; int carry = 0; while(p != NULL || q != NULL){ int sum = 0, x = 0, y = 0; if(p){ x = p->val; p = p->next; } if(q){ y = q->val; q = q->next; } sum = x + y + carry; carry = sum/10; curr->next = new ListNode(sum % 10); curr = curr->next; } if(carry) { curr->next = new ListNode(carry); } return newHead->next; } };