两数相加

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

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

详细题解

加法模拟,使用变量carry来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
    struct ListNode *result = NULL;
    struct ListNode *l3 = NULL;
    int carry = 0;
    int val1, val2;

    if (!l1 && !l2) {
        return NULL;
    }

    while (l1 || l2 || carry) {
        if (l1) {
            val1 = l1->val;
            l1 = l1->next;
        } else {
            val1 = 0;
        }

        if (l2) {
            val2 = l2->val;
            l2 = l2->next;
        } else {
            val2 = 0;
        }

        if (!l3) {
            l3 = malloc(sizeof(struct ListNode));
            assert(l3 != NULL);
            result = l3;

        } else {
            l3->next = malloc(sizeof(struct ListNode));
            assert(l3->next != NULL);
            l3 = l3->next;
        }

        l3->val = (val1 + val2 + carry) % 10;
        l3->next = NULL;
        carry = (val1 + val2 + carry) / 10;
    }

    return result;
}
方法时间复杂度空间复杂度结果时间内存
模拟加法O(max(l1.len, l2.len))O(max(l1.len, l2.len))通过24ms8.9M

 
 
 
 
 
 

01-16 17:17