题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目解析
我们模拟两个数相加,遍历两个链表。至于顺序,虽然是相反的,但是我们重新创建一个带头结点的链表的时候,直接让两个数相加就可以了进位向后面链接就行!
如果两个数长度不同,那么让那个短的位补0,也就是当一个数还没遍历完,但是另一个数已经遍历完毕了,那么就让短的那个数遍历的结点填补0。最后还要判断是否有进位,如果有进位,那么把该数继续接入链表后面,说明最后一次相加的时候有进位没有进行处理。
两个数相加sum=num1+num2+carry,下一位需要进的位carry=sum/10,当前位剩下的数sum%10。
代码
/**
* 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;
// 若其中一个链表先遍历到nullptr时
// 再次遍历到该链表的结点就视为0
int carry=0;
while(l1||l2)
{
// 若为nullptr就取0
int num1=l1?l1->val:0;
int num2=l2?l2->val:0;
int sum=num1+num2+carry;
if(head==nullptr)
head=tail=new ListNode(sum%10);
else
{
tail->next=new ListNode(sum%10);
tail=tail->next;
}
carry=sum/10;
if(l1) l1=l1->next;
if(l2) l2=l2->next;
}
if(carry>0)
tail->next=new ListNode(carry);
return head;
}
};