给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例1输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.示例2
输入:l1 = [0], l2 = [0] 输出:[0]示例3
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围 [1, 100] 内
- 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
线性处理,逐一处理,此方法不考虑对两条链表进行补充元素的操作。
class Solution
{
public:
ListNode *pStart = nullptr, *pEnd = nullptr;
bool isCarry = false; //表示是否进位
//判断是否需要进位
void IsCarry(int &val)
{
if (isCarry)
val += 1;
if (val > 9)
{
isCarry = true;
val -= 10;
}
else
isCarry = false;
}
//插入元素
void InsertVal(ListNode *node)
{
if (pStart == nullptr)
{
pStart = node;
pEnd = node;
}
else
{
pEnd->next = node;
pEnd = node;
}
}
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
while (l1 != nullptr || l2 != nullptr)
{
int val = 0;
//两条链表均不为空
if (l1 != nullptr && l2 != nullptr)
{
val = l1->val + l2->val;
IsCarry(val);
l1->val = val;
InsertVal(l1);
l1 = l1->next;
l2 = l2->next;
}
//l1链表不为空
if (l1 != nullptr && l2 == nullptr)
{
IsCarry(l1->val);
InsertVal(l1);
l1 = l1->next;
}
//l2链表不为空
if (l2 != nullptr && l1 == nullptr)
{
IsCarry(l2->val);
InsertVal(l2);
l2 = l2->next;
}
}
//如果最后进位未完成
if(isCarry)
pEnd->next = new ListNode(1);
return pStart;
}
};
方式二
如果两个链表长度不相等,则对较短的那个链表补充元素(值为0),直至与较长的链表长度相等即可,最后考虑进位。
该方式题解来源于:
作者:chenlele
链接:https://leetcode.cn/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-gpe3dbjds1/
// @lc code=start
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int len1=1;//记录l1的长度
int len2=1;//记录l2的长度
ListNode* p=l1;
ListNode* q=l2;
while(p->next!=NULL)//获取l1的长度
{
len1++;
p=p->next;
}
while(q->next!=NULL)//获取l2的长度
{
len2++;
q=q->next;
}
if(len1>len2)//l1较长,在l2末尾补零
{
for(int i=1;i<=len1-len2;i++)
{
q->next=new ListNode(0);
q=q->next;
}
}
else//l2较长,在l1末尾补零
{
for(int i=1;i<=len2-len1;i++)
{
p->next=new ListNode(0);
p=p->next;
}
}
p=l1;
q=l2;
bool count=false;//记录进位
ListNode* l3=new ListNode(-1);//存放结果的链表
ListNode* w=l3;//l3的移动指针
int i=0;//记录相加结果
while(p!=NULL&&q!=NULL)
{
i=count+p->val+q->val;
w->next=new ListNode(i%10);
count=i>=10?true:false;
w=w->next;
p=p->next;
q=q->next;
}
if(count)//若最后还有进位
{
w->next=new ListNode(1);
w=w->next;
}
return l3->next;
}
};



