lectcode-链表-两数之和

本文介绍了一种使用链表表示非负整数并实现加法运算的算法。通过将链表位数逆序存储,实现两个数相加并返回新的链表表示结果。文章详细解析了算法步骤,包括处理不同长度链表的对齐问题和进位逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/add-two-numbers

示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

代码

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=l1;
    q=l2;
    bool count=false;//记录进位  也可以用 int count = 0; 
    ListNode* l3=new ListNode(-1);//存放结果的链表
    ListNode* w=l3;//l3的移动指针
    int i=0;//记录相加结果
    while(p!=NULL&&q!=NULL)
    {
        i=count+p->val+q->val;    //bool和int可以相加,true代表1,flase代表0
        w->next=new ListNode(i%10);
        count=i>=10?true:false;  //判断是否需要进位
        w=w->next;
        p=p->next;
        q=q->next;
    }
    if(count)//若最后还有进位
    {
        w->next=new ListNode(1);
        w=w->next;
    }
    return l3->next; 
}
};

注意要点

  • 首先需要判断是否需要加0,因为给的数据不一定位数相同
  • 必须要考虑进位问题,因为是两数相加,所以最大进位为1,可以用bool型来判断进位并且加减,如果是此种形式的多数相加,需要用int型来判断进位,因为三数相加会出现进2以上的数字。

2019年12月12日记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值