leetcode刷题日记——两数相加

[ 题目描述 ]:
在这里插入图片描述
[ 思路 ]:

  • 通过两个循环将 l1, l2存储的数字读出,然后求和,再将结果存储链表中
  • 由此发了一个问题,结果溢出,如果使用更大的 long 类型,后续不出所料,仍然超出
  • 所以只能转换思路
    在这里插入图片描述
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    int num1=0,num2=0,res=0,index=0;
    while(l1){
        num1=num1+l1->val*pow(10,index++);
        l1=l1->next;
    }
    index=0;
    while(l2){
        num2=num2+l2->val*pow(10,index++);
        l2=l2->next;
    }
    res=num1+num2;
    struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* rear=head;
    if(res==0){
        rear->next=(struct ListNode*)malloc(sizeof(struct ListNode));
        rear=rear->next;
        rear->val=0;
    }else{
        while(res!=0){
            rear->next=(struct ListNode*)malloc(sizeof(struct ListNode));
            rear=rear->next;
            rear->val=res%10;
            res/=10;
        }
    }
    rear->next=NULL;
    return head->next;
}
  • 既然不能一次性存储所有结果,那么就只能模拟加法器,一位一位的计算
  • 运行如下
    在这里插入图片描述
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    int carry=0;
    struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* rear=head;
    while(l1 || l2 || carry!=0){
        int num1=0,num2=0;
        if(l1){
            num1=l1->val;
            l1=l1->next;
        }
        if(l2){
            num2=l2->val;
            l2=l2->next;
        }
        carry+=num1+num2;
        rear->next=(struct ListNode*)malloc(sizeof(struct ListNode));
        rear=rear->next;
        rear->val=carry%10;
        carry/=10;
    }
    rear->next=NULL;
    return head->next;
}

[ 官方题解 ]:

  • 方法一:模拟,具体思路同上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值