题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
这个题的思路,我的可能比较简单,就是先找出链表的长度,然后,再使两个链表相等,当两个链表不相等的时候,短的链表补零,然后当两个链表相等的时候,然后进位相加,而其中不理解的地方,我进行标注。
代码实现:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int leng1=1;
int leng2=1;
ListNode* p=l1;//将p变成l1的移动指针。同理,下面也是一样。
ListNode* q=l2;
while(p->next!=NULL)//获取L1的长度。
{
leng1++;
p=p->next;
}
while(q->next!=NULL)//同理
{
leng2++;
q=q->next;
}
if(leng1>leng2)//用0将两个链表补成一样长的。
{
for(int i=0;i<leng1-leng2;i++)
{
q->next=new ListNode(0);
q=q->next;
}
}
else
{
for(int i=0;i<leng2-leng1;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;
}
};