leetcode 2. 两数相加

 c语言实现:

如果将链表转化为整形或者长整型都无法满足长链表的计算导致结果数值溢出,于是利用归并的思想,计算相同位置的和,保存进位值,将结果保存进新的链表,就不用考虑大数加法的问题了,非常的巧妙。

void print_list(struct ListNode *h) {
    printf("print list:[");
    struct ListNode *d = h;
    while(d) {
        printf("%d,", d->val);
        d = d->next;
    }
    printf("]\n");
}

struct ListNode *reverse_list(struct ListNode *h) {
    struct ListNode *t = h;
    struct ListNode *tnext = NULL;
    struct ListNode *tprev = NULL;
    while(t->next) {
        tnext = t->next;
        t->next = tprev;
        tprev = t;
        t = tnext;        
    }
    t->next = tprev;
    return t;
}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* head = (struct ListNode *)malloc(sizeof(struct ListNode));
    head->next = NULL;
    ull n1 = 0;
    ull n2 = 0;
    print_list(l1);
    print_list(l2);
    int carry = 0;
    struct ListNode* h = (struct ListNode *)malloc(sizeof(struct ListNode));
    h->next = NULL;
    struct ListNode* t = h;
    while(l1 != NULL || l2 != NULL || carry != 0) {

        int v1 = 0, v2 = 0;
        if(l1 != NULL)
            v1 = l1->val;
        if(l2 != NULL)
            v2 = l2->val;

        int sum = v1 + v2 + carry;
        int v = sum % 10;
        carry = sum / 10;
        
        struct ListNode* node = (struct ListNode *)malloc(sizeof(struct ListNode));
        node->next = NULL;
        node->val = v;

        t->next = node;
        t = t->next;
        if(l1 != NULL)
            l1 = l1->next;
        if(l2 != NULL)
            l2 = l2->next;
    }
    
    print_list(h->next);

    return h->next;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值