c语言实现:
如果将链表转化为整形或者长整型都无法满足长链表的计算导致结果数值溢出,于是利用归并的思想,计算相同位置的和,保存进位值,将结果保存进新的链表,就不用考虑大数加法的问题了,非常的巧妙。
void print_list(struct ListNode *h) {
printf("print list:[");
struct ListNode *d = h;
while(d) {
printf("%d,", d->val);
d = d->next;
}
printf("]\n");
}
struct ListNode *reverse_list(struct ListNode *h) {
struct ListNode *t = h;
struct ListNode *tnext = NULL;
struct ListNode *tprev = NULL;
while(t->next) {
tnext = t->next;
t->next = tprev;
tprev = t;
t = tnext;
}
t->next = tprev;
return t;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* head = (struct ListNode *)malloc(sizeof(struct ListNode));
head->next = NULL;
ull n1 = 0;
ull n2 = 0;
print_list(l1);
print_list(l2);
int carry = 0;
struct ListNode* h = (struct ListNode *)malloc(sizeof(struct ListNode));
h->next = NULL;
struct ListNode* t = h;
while(l1 != NULL || l2 != NULL || carry != 0) {
int v1 = 0, v2 = 0;
if(l1 != NULL)
v1 = l1->val;
if(l2 != NULL)
v2 = l2->val;
int sum = v1 + v2 + carry;
int v = sum % 10;
carry = sum / 10;
struct ListNode* node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->next = NULL;
node->val = v;
t->next = node;
t = t->next;
if(l1 != NULL)
l1 = l1->next;
if(l2 != NULL)
l2 = l2->next;
}
print_list(h->next);
return h->next;
}