题目:
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-lists-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析:
在进行求和的过程中,需要考虑的最重要的两个方面就是:本数位上之和,还有就是进位.那么我们首先考虑本位数之和,本位数之和包括,两个相同位数的数相加,另外还有就是上一位的进位.上一位数的进位会经常被我们给忽略.我们对这三项数的和采用相加取余的方式就能够得到本位数.(取余操作经常被用作算进位时,本位数之和,大家记住就好).另外,在计算进位时,大家可以对三项数的和进行除法运算,如果商为1,则有进位.商为0,则没有进位.我们可以用一个数去存进位.待下一次循环用.
算法:
/* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int carry = 0;
ListNode *head = new ListNode();
head->val = 0;
ListNode *pre = head;
while(l1 != NULL || l2 != NULL || carry!=0){
ListNode *node = new ListNode();
int sum = (l1 != NULL? l1->val: 0) + (l2 != NULL?l2->val: 0) + carry;
carry = sum/10;
node->val = sum%10;
pre->next = node;
pre = node;
l1 = l1 != NULL? l1->next: NULL;
l2 = l2 != NULL? l2->next: NULL;
}
return head->next;
}
};