题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
1.处理两个链表的公共部分
- 两链表对应位置的数以及上一位产生的进位相加
- 计算相加产生的进位next_num
- 用尾插法插入链表尾部
2.处理剩余部分
/**
* 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) {
int next_num=0;//记录进位
ListNode *ans_head=nullptr; //头指针
ListNode *rear=nullptr; //尾指针
//处理公共部分
while(l1!=nullptr&&l2!=nullptr)
{
ListNode *s=new ListNode();
int temp=l1->val+l2->val+next_num;
s->val=temp>=10?(temp-10):temp;
next_num = temp>=10?1:0;
if(ans_head==nullptr)
rear=ans_head=s;
else
{
rear->next=s;
rear=s;
}
l1=l1->next;l2=l2->next;
}
//处理剩余部分
int flag=1;
//情况1--链表l1有剩余部分
while(l1!=nullptr)
{
ListNode *s=new ListNode();
s->val=l1->val;
if(flag==1)
{
int temp=l1->val+next_num;
s->val=temp>=10?(temp-10):temp;
next_num = temp>=10?1:0;
flag=temp>=10?1:0;
}
if(ans_head==nullptr)
rear=ans_head=s;
else
{
rear->next=s;
rear=s;
}
l1=l1->next;
}
//情况2--链表l2有剩余部分
while(l2!=nullptr)
{
ListNode *s=new ListNode();
s->val=l2->val;
if(flag==1)
{
int temp=l2->val+next_num;
s->val=temp>=10?(temp-10):temp;
next_num = temp>=10?1:0;
flag=temp>=10?1:0;
}
if(ans_head==nullptr)
rear=ans_head=s;
else
{
rear->next=s;
rear=s;
}
l2=l2->next;
}
//处理最后一位--若产生进位--则next_num不为0
if(next_num!=0)
{
ListNode *s=new ListNode(next_num);
if(ans_head==nullptr)
rear=ans_head=s;
else
{
rear->next=s;
rear=s;
}
}
return ans_head;
}
};