leetcode刷题笔记新地址(仍在更新)
https://github.com/MyLinChi/LeetcodeNote
问题描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
问题分析
在计算机中实现两个数相加的方法是
S
=
A
+
B
+
C
S = A + B + C
S=A+B+C
S-和,A-被加数,B-被加数,C-进位
注意事项
1.初始时
C
=
0
C=0
C=0
2.当其中一个链表的数加完时,计算的式子将变成
S
=
A
+
C
S = A + C
S=A+C(或
S
=
B
+
C
S = B + C
S=B+C)的形式,因此要对剩余的链表中的数据继续相加。
3.当所有的链表中的元素已经计算完毕,如果
C
!
=
0
C!=0
C!=0,那么应该给结果链表多分配一个结点存储进位。
4.链表的输入采用头插法,根据计算过程和结果的形式,结果链表的生成采用尾插法;为了便于链表的操作,开始时给结果链表分配一个空结点,只需返回空结点指向的链表即可。
代码
#include<iostream>
#include<string>
using namespace std;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
int c;
Solution() :c(0){}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode * ans = new ListNode(0);//null node
ListNode * tail = ans;
while (l1&&l2)
{
int sum = l1->val + l2->val + c;
c = sum / 10;
tail->next = new ListNode(sum % 10);
tail = tail->next;
l1 = l1->next;
l2 = l2->next;
}
if (l1){
while (l1)
{
int sum = l1->val + c;
c = sum / 10;
tail->next = new ListNode(sum % 10);
tail = tail->next;
l1 = l1->next;
}
}else if (l2){
while (l2)
{
int sum = l2->val + c;
c = sum / 10;
tail->next = new ListNode(sum % 10);
tail = tail->next;
l2 = l2->next;
}
}
if (c){
tail->next = new ListNode(c);
tail = tail->next;
}
return ans->next;
}
};
int main()
{
ListNode * a = NULL, *b = NULL,*tp = NULL;
char t;
while (cin >> t){
if ('#' == t)break;
tp = a;
a = new ListNode(t - '0');
a->next = tp;
}
while (cin >> t){
if ('#' == t)break;
tp = b;
b = new ListNode(t - '0');
b->next = tp;
}
Solution s;
ListNode * c;
c = s.addTwoNumbers(a, b);
return 0;
}