2.两数相加
给出两个非空的链表用来表示两个非负的整数。其中,他们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示他们的和。
您可以假设除了数字 0 以外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3)+ (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:link
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析 :问题的核心在于判断两个数之和是否需要进位,
C++源码:
/** * 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* List = new ListNode(0);
ListNode* L1 = l1;
ListNode* L2 = l2;
//如果原链表有任一为空,则直接返回另一条链
if(L1 == NULL)
return L2;
if(L2 == NULL)
return L1;
//对链表的第一个节点进行操作,此链表为物头节点的链表
int label = (L1->val + L2->val)/10;//保存进位数字
List->val = (L1->val + L2->val) % 10;//进位数与不进位数可直接用取余表示
ListNode* L3 = List;
L1 = L1->next;
L2 = L2->next;
//两条链表都有元素,需要进行加法运算
while(L1 && L2)
{
ListNode* temp = new ListNode(0);
int m = L1->val + L2->val + label;
if(m >= 10)
{
temp->val = m % 10;
label = 1;
}
else
{
temp->val = m;
label = 0;
}
L1 = L1->next;
L2 = L2->next;
L3->next = temp;
L3 = temp;
}
//剩下一条链表,继续操作
while(L1)
{
ListNode* temp = new ListNode(0);
//如果之前有进位,则需要进位
if(label)
{
if(L1->val + 1 == 10)
{
temp->val = 0;
label = 1;
}
else
{
temp->val = L1->val + 1;
label = 0;
}
}
else
temp->val = L1->val;
L3->next = temp;
L3 = temp;
L1 = L1->next;
}
while(L2)
{
ListNode* temp = new ListNode(0);
if(label)
{
if(L2->val + 1 == 10)
{
temp->val = 0;
label = 1;
}
else
{
temp->val = L2->val + 1;
label = 0;
}
}
else
temp->val = L2->val;
L3->next = temp;
L3 = temp;
L2 = L2->next;
}
//如果最后一项保留了进位,则需要加一位数字
if(label)
{
ListNode* temp = new ListNode(0);
temp->val = 1;
L3->next = temp;
L3 = temp;
}
return List;
}
};