题目
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。
示例
输入:l1 = (2,4,3), l2 = (5,6,4)
输出:(7,0,8)
解释:342 + 465 = 807
代码
c
// 定义链表节点结构体
typedef struct Node {
int val;
struct Node* next;
} Node;
typedef Node* List;
// 计算链表长度
int length(List l) {
struct Node* p = l;
int i = 0;
while (p!= NULL) {
p = p->next;
i++;
}
return i;
}
// 两数相加函数
List addTwoNumbers(List l1, List l2) {
int len1 = length(l1);
int len2 = length(l2);
// 在较短链表后面补零,使两链表长度相等
if (len1 > len2) {
int dist = len1 - len2;
while (dist--) {
struct Node* s = (struct Node*)malloc(sizeof(struct Node));
s->val = 0;
List p2 = l2;
while (p2->next!= NULL) {
p2 = p2->next;
}
p2->next = s;
p2 = s;
}
} else if (len1 < len2) {
int dist = len2 - len1;
while (dist--) {
struct Node* s = (struct Node*)malloc(sizeof(struct Node));
s->val = 0;
List p1 = l1;
while (p1->next!= NULL) {
p1 = p1->next;
}
p1->next = s;
p1 = s;
}
}
List q = l2;
List p = l1;
List l3 = (struct Node*)malloc(sizeof(struct Node));
List r = l3;
int temp_next = 0, sum = 0;
sum = p->val + q->val;
r->val = sum % 10;
temp_next = sum / 10;
p = l1->next;
q = l2->next;
while (p!= NULL && q!= NULL) {
sum = p->val + q->val + temp_next;
int val_store = sum % 10;
temp_next = sum / 10;
struct Node* s = (struct Node*)malloc(sizeof(struct Node));
s->val = val_store;
r->next = s;
r = s;
p = p->next;
q = q->next;
}
if (temp_next!= 0) {
struct Node* s = (struct Node*)malloc(sizeof(struct Node));
s->val = temp_next;
r->next = s;
r = s;
}
r->next = NULL;
return l3;
}
大概思路
首先通过 length 函数获取两个链表的长度,然后根据长度差异在较短链表后补零。接着遍历两个链表对应节点,将节点值相加并考虑进位,将结果存储到新链表中,最后若有进位则在新链表末尾添加进位节点,最终返回结果链表。