欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-06 15:30:06
...

题目描述

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

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

您可以假设除了数字 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;
}
相关标签: 编程练习