[LeetCode T2(c语言)] Add Two Numbers

题目描述

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

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

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

示例:

 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
 输出:7 -> 0 -> 8
 原因:342 + 465 = 807

解题思路

一、第一步仔细读题目,两个无符号整数相加,整数用链表表示,所以这两个整数位数很多。因此不
能直接相加,否则可能会溢出。

二、整数用链表表示,所以可以模拟加法操作进行一位一位相加,当和大于或等于10时,个位留在链表当前位置,并在链表下一位置加一。

三、两个链表可能不一样长,所以要进行判断哪个链表先达到尾部。共有三种情况:
1、两个链表同时到达尾部。此时判断上次相加是不是有进位,若有的话还需扩展链表。否则直接返回即可;
2、第一个链表先到达尾部。
3、第二个链表先到达尾部。

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode *h, *p, *q; int a = 0, b = 0, temp = 0;
    h = p = (struct ListNode*)malloc(sizeof(struct ListNode));
    h->next = NULL;
    while(l1 && l2){
        q = (struct ListNode*)malloc(sizeof(struct ListNode));
        a = l1->val + l2->val + b;
        if(a >= 10){
            a = a % 10;
            b = 1;
        }
        else b = 0;
        q->val = a;
        q->next = NULL;
        p->next = q;
        p = q;
        l1 = l1->next;
        l2 = l2->next;
    }
    if((l1 == NULL)&&(l2 == NULL)){
        if(b == 0) return h->next;
        else{
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            q->val = b;
            q->next = NULL;
            p->next = q;
            p = q;
            return h->next;
        }
    }
    else if(l1 == NULL){
        while(l2){
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            a = l2->val + b;
            if(a >= 10){
                a = a % 10;
                b = 1;
            }
            else b = 0;
            q->val = a;
            q->next = NULL;
            p->next = q;
            p = q;
            l2 = l2->next;
        }
    }
    else{
        while(l1){
            q = (struct ListNode*)malloc(sizeof(struct ListNode));
            a = l1->val + b;
            if(a >= 10){
                a = a % 10;
                b = 1;
            }
            else b = 0;
            q->val = a;
            q->next = NULL;
            p->next = q;
            p = q;
            l1 = l1->next;
        }
    }
    if(b == 1){
        q = (struct ListNode*)malloc(sizeof(struct ListNode));
        q->val = b;
        q->next = NULL;
        p->next = q;
        p = q;
    }
    return h->next;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值