力扣第二题:链表对应位相加(有进位)

题的描述是这样的:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

分析:
也就是说,4->3->2, 代表数字234;0->5->1,代表数字150;是不会有1->2->0,这样的数字形式出现的。
4->3->2+0->5->1=4->8->3,结果为数字384;
9->9->9->9->9+9->9->9=8->9->9->0->0->1,
999+99999,结果为数字100998。
每位数字都是逆序存储,那就是链表的头部都是低位,如果两个链表的长度不一样,我们可以高位补零使两个链表等长位数对齐,然后每位对应相加,从两个链表的头开始,注意进位。
自己也写了代码啰嗦又麻烦 ,大神的代码真的是写的太好了!这个题的记录进位的部分简直是绝了!然后自己也简单的给大家解读一下大神的代码,欢迎指正!
代码如下:

class Solution {
    
    
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    
    
        int len1=1;//记录l1的长度
        int len2=1;//记录l2的长度
        ListNode* p=l1;
        ListNode* q=l2;
        while(p->next!=NULL)//获取l1的长度
        {
    
    
            len1++;
            p=p->next;
        }
        while(q->next!=NULL)//获取l2的长度
        {
    
    
            len2++;
            q=q->next;
        }
        if(len1>len2)//若l1较长,在l2末尾补零
        {
    
    
            for(int i=1;i<=len1-len2;i++)
            {
    
    
                q->next=new ListNode(0);
                q=q->next;
            }
        }
        else//若l2较长,在l1末尾补零
        {
    
    
            for(int i=1;i<=len2-len1;i++)
            {
    
    
                p->next=new ListNode(0);
                p=p->next;
            }
        }
        //因为上面遍历到末尾然后需要给p,q指针重新赋值到两个链表的头
        p=l1;
        q=l2;
        bool count=false;//记录进位
        ListNode* l3=new ListNode(-1);//定义一个存放结果的链表
        ListNode* w=l3;//l3的移动指针
        int i=0;//记录相加结果
        //现在两个链表的位数一定是相同的,可以开始进行运算,刚开始的
        //count为bool类型false,int类型相加就转化为0,为true就转化为1
        //如果相加结大于10;那么count为true为1;就会进位到下一次相加中,
        //小于10则无影响(太妙了!)
        
        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;
        }
        //最后一位还有进位,但是p,q得next都为NULL,所以进不到循环
        if(count)//若最后还有进位
        {
    
    
            w->next=new ListNode(1);
            w=w->next; //(个人觉得这句话可以去掉)
        }
        return l3->next; 
    }
};

ListNode* l3=new ListNode(-1)里为什么是-1?
这个是头结点,只是为了方便建立链表,值可以任意取,你看最后是return l3->next,不会反回这个头结点的值。
最后的return l3->next是什么意思?
返回头结点l3指向的下一个结点,因为l3里面的val没有意义,它的下一个结点才有意义

作者:chenlele
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-gpe3dbjds1/
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

猜你喜欢

转载自blog.csdn.net/scarificed/article/details/112755021
今日推荐