思路:链表逆序存储数字,则链表头部节点开始分别代表个十百千位,两个链表对应节点相加即为和的相应位,注意考虑进位的情况,所以结果链表节点的值为(l1+l2+flag)%10,同时记录该位相加完是否有进位。
1、两个链表都遍历完后,最后一位进位需要添加至链表结尾。
2、两个指针的作用,head用来记录链表头结点用于函数返回,tail用于链表尾插法插入元素
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head=nullptr,*tail=nullptr; //定义两个节点,一个头节点一个尾节点用于插入新节点
int flag=0; //记录进位数字
while(l1||l2){ //只要没有两个链表都为空则说明还没有遍历完
int a=l1?l1->val:0; //逐位获取值,若链表长度不够时默认补0
int b=l2?l2->val:0;
int sum=a+b+flag; //相同位相加,还要加上低位的进位
flag=sum/10; //进位数值
if(head==nullptr){ //首个节点,定义head指向第一个节点
head=tail=new ListNode(sum%10); //%10是因为sum是包含进位的有可能>10
}
else{ //不是首个节点,则用tail进行尾插法
tail->next=new ListNode(sum%10);
tail=tail->next; //插入后向后移动
}
if(l1){ //链表非空,取下一位
l1=l1->next;
}
if(l2){
l2=l2->next;
}
}
if(flag){ //若最高位相加后还有进位则将进位插入
tail->next=new ListNode(flag);
}
return head;
}
};