Q: You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in reverse order, such that the 1’s digit is wat the head of the list. Write a function that adds the two numbers and returns the sum as a linked list. EXAMPLE Input: (3 -> 1 -> 5) + (5 -> 9 -> 2) Output: 8 -> 0 -> 8
A: 简单的逐位相加问题,。不要溜掉最后以为有进位的情况即可。
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode *init(int a[], int n) {
ListNode *head = NULL;
ListNode *p = NULL;
for (int i = 0; i < n; i++) {
ListNode *cur = new ListNode(a[i]);
if (i == 0) {
head = cur;
p = cur;
}
p->next = cur;
p = cur;
}
return head;
}
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
if (!l1) {
return l2;
} else if (!l2) {
return l1;
}
ListNode dummy(-1);
int carry = 0;
ListNode *prev = &dummy;
for (ListNode *p = l1, *q = l2; p != NULL || q != NULL; p = p?p->next:NULL, q = q?q->next:NULL, prev = prev->next) {
const int a = p?p->val:0;
const int b = q?q->val:0;
int value = (a+b+carry)%10;
carry = (a+b+carry)/10;
prev->next = new ListNode(value);
}
if (carry == 1) {
prev->next = new ListNode(carry);
}
return dummy.next;
}
void printList(ListNode *head) {
ListNode *p = head;
for( ; p; p = p->next) {
cout<<p->val<<" ";
}
cout<<endl;
}
int main() {
int a[10] = {2,4,3};
int b[10] = {5,6,4};
ListNode *head1 = init(a, 3);
ListNode *head2 = init(b, 3);
printList(head1);
printList(head2);
ListNode *head = addTwoNumbers(head1, head2);
printList(head);
return 0;
}