给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解析
实现链表数字的相加,思路和我们进行普通加法运算相同,两数从低位开始同位相加,并保存进位信息。
注意
两链表长度可能不一致,所以需要考虑,在都有数字的位相加和较长那个链表最后几位的单独加,此时,我们就需要判断链表长度,并对这两段分别编写程序。
好在它的存储方式是逆序存储,不存在尾端需对齐的问题。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p1=l1;
ListNode* p2=l2;
ListNode* p3=NULL;//用来一直new新的内存
ListNode* head=NULL;
ListNode* tail=NULL;//head,tail为首尾指针指向和链表
int add=0;
while(p1->next!=NULL&&p2->next!=NULL)//两个链表相同长度的地方相加 {
int temp=p1->val+p2->val+add;//三部分组成
p3=new struct ListNode(temp%10);
if(head==NULL) {
head=p3;
tail=p3;//第一个数,首尾指针都指p3 }
else {
tail->next=p3;//连接后面的
tail=tail->next;//更新尾指针 }
add=temp/10;
p1=p1->next;
p2=p2->next; }
//还剩了一次,未加,因为判断的next为空,最后一个数的next就是空,所以重复一次
int temp=p1->val+p2->val+add;//三部分组成
p3=new struct ListNode(temp%10);
if(head==NULL) {
head=p3;
tail=p3;//第一个数,首尾指针都指p3}
else {
tail->next=p3;//连接后面的
tail=tail->next;//更新尾指针 }
add=temp/10;
//计算不等长部分
ListNode* p=NULL;
if(p1->next!=NULL)
p=p1->next;
if(p2->next!=NULL)
p=p2->next;
while(p!=NULL) {
int temp=p->val+add;
p3=new struct ListNode(temp%10);
if(head==NULL) {
head=p3;
tail=p3;//第一个数,首尾指针都指p3 }
else {
tail->next=p3;//连接后面的
tail=tail->next;//更新尾指针 }
add=temp/10;
p=p->next; }
//最后的进位
if(add!=0)
{
p3=new struct ListNode(add);
if(head==NULL){
head=p3;
tail=p3;//第一个数,首尾指针都指p3
} else{
tail->next=p3;//连接后面的
tail=tail->next;//更新尾指针}}
return head; }};