力扣题解:2、两数相加

个人认为,该题目可以看作合并两个链表的变种题,本题与21题不同的是,再处理两个结点时,对比的不是两者的大小,而是两者和是否大于10,加法计算中大于10要进位,所以我们需要声明一个用来标记是否进位的值。

解题思路:

1、直接从链表头部开始相加就是从数字的最低位开始相加。

2、同时遍历两个链表,将对应位置的数字相加,并考虑前一位的进位。

3、每次相加后,可能会有进位(即和大于等于10),需要将进位加到下一位的计算中。

4、如果两个链表长度不同,较短的链表在后续遍历中可以视为 0

5、如果遍历完所有节点后仍有进位,需要额外创建一个节点来存储这个进位。

代码:

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) 
{
    struct ListNode* l3=malloc(sizeof(struct ListNode));
    struct ListNode* head=l3;
    int carry=0;
//两个链表不为空或有进位时,进行计算
    while(l1!=NULL||l2!=NULL||carry!=0)
    {
 // 初始化和为当前进位
        int sum=carry;
        if(l1!=NULL)
        {
// 如果 l1 不为空,累加 l1 的当前值,并移动 l1 到下一个节点
            sum+=l1->val;
            l1=l1->next;
        }
        if(l2!=NULL)
        {
 // 如果 l2 不为空,累加 l2 的当前值,并移动 l2 到下一个节点
            sum+=l2->val;
            l2=l2->next;
        }
        //进位的数字计算
        carry=sum/10;
        sum%=10;
//在结果链表创建新结点,存储sum
        l3->next=malloc(sizeof(struct ListNode));
        l3=l3->next;
        l3->val=sum;
        l3->next=NULL;
    }
// 返回结果链表的头节点(跳过虚拟头节点)
    return head->next;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值