两数相加
题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 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)) | 通过 | 24ms | 8.9M |