题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
实例1;
2->4->3; 5->6->4;
输出:
7->0->8;
当程序输入示例1时,实际上输出为243+465=708;之后再将得到的结果按低位到高位逆序创造一个链表并输出。
解题思想1:
将输入的两个链表重新组合成整型的整数,再将两个整数直接相加得到一个新的整数。再将这个整数重新分出低位和高位放进新创建的链表里。
这个算法思想可以通过大多数的例子,但是有些例子随着链表长度的增长,将链表对应的整数输出将超过整型变量的输出范围,甚至超过了长整型变量允许的范围。导致该算法只能适用于链表不是很长的情况。
为解决这一问题,我们提出了新的解题思想:
解题思想2:
在解题思想2中,我们不再去将链表中的数据转化为整型储存到变量当中,直接在链表中进行对应位的相加,这样就避免了整型变量范围不够大的问题。
因为在实际的整数相加中,我们也是从低位到高位进行相加,例如342+123,我们首先考虑的就是两个整数的个位2与3的相加。相加得5,所以在返回的链表中的第一位就存储的是5。
由上例所示,我们整体的算法思想就是按每一位分别相加。这里就出现了在加法中我们需要考虑到的进位的问题。比如在107+207的情况下,个位的相加为7+7=14,于是我们在新的链表的对应位个位储存的数据就应为4,这个在算法中可以通过取余的运算来实现。进位的问题就需要我们额外的设计一个变量,用来储存是否有进位的产生。于是在上例中,我们个位的相加是7+7=14,于是在新的链表中的第一位就为4,而在这个例子中,产生了进位,所以存储进位的变量就设置为1,这样在次高位的加法中就变成了0+0+1=1;
最后一个需要考虑的问题就是在最高位的加法中出现进位。如99+5,这里在最高位会出现9+1=10的情况,这个时候我们在链表的最后就应该将10分成0和1进行输出。
至此完成该题的解题思想解答。
解法思想1代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int i = 1;
int num1=0, num2=0;
while (l1 != nullptr) {
num1 = (l1->val) * i+num1;
i = i * 10;
l1 = l1->next;
} //将链表1中的数据转成整型
i = 1;
while (l2 != nullptr) {
num2 = (l2->val) * i+num2;
i = i * 10;
l2 = l2->next;
} //将链表2中的数据转成整型
num1 = num1 + num2; //将两个数据相加
ListNode* l3=nullptr;
l3 = new ListNode;
l3->val = num1 % 10;
l3->next = nullptr;
num1 = num1 / 10;
ListNode* head = l3;
ListNode* temp = nullptr;
while (num1 != 0) {
temp = new ListNode;
temp->val = num1 % 10;
temp->next = nullptr;
head->next = temp;
head = head->next;
num1 = num1 / 10;
}
return (l3);
}
};
解法思想2代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int judge = 0;
int num1 = 0; int num2 = 0;
ListNode* l3=nullptr;
l3 = new ListNode;
l3->val =(l1->val+l2->val)%10;
l3->next = nullptr;
if (l1->val + l2->val >= 10)
judge = 1;
ListNode* head = l3;
ListNode* temp = nullptr;
l1 = l1->next;
l2 = l2->next;
while (l1!= nullptr || l2!=nullptr) {
temp = new ListNode;
if (l1 == nullptr) {
num1 = 0;
}
else {
num1 = l1->val;
}
if (l2 == nullptr) {
num2 = 0;
}
else {
num2 = l2->val;
}
temp->val = ((num1 + num2) + judge)%10;
if (num1+num2 +judge>= 10) {
judge = 1;
}
else
{
judge = 0;
}
temp->next = nullptr;
head->next = temp;
head = head->next;
if(l1!=nullptr)
l1 = l1->next;
if(l2!=nullptr)
l2 = l2->next;
}
if (judge == 1) {
temp = new ListNode;
temp-> val= 1;
temp->next = nullptr;
head->next = temp;
head = head->next;
}
return (l3);
}
};
最终提交结果如下: