You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7
Solution
使用栈记录数字,然后依次计算,使用头插法插入结果链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int getLen(struct ListNode* l) {
int len = 0;
struct ListNode *p = l;
while (p != NULL) {
len = len + 1;
p = p->next;
}
return len;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
int len1 = getLen(l1), len2 = getLen(l2);
int* stack1 = calloc(len1, sizeof(int));
int* stack2 = calloc(len2, sizeof(int));
int top1 = -1, top2 = -1;
while (l1 != NULL) {
stack1[++top1] = l1->val;
l1 = l1->next;
}
while (l2 != NULL) {
stack2[++top2] = l2->val;
l2 = l2->next;
}
bool flag = true;
int a, b, sum, Cout = 0;
struct ListNode *p = malloc(sizeof(struct ListNode));
p->next = NULL;
while (top1 != -1 || top2 != -1) {
a = top1 == -1 ? 0 : stack1[top1--];
b = top2 == -1 ? 0 : stack2[top2--];
sum = a + b + Cout;
Cout = sum / 10;
sum = sum - Cout * 10;
if (flag) {
p->val = sum;
flag = false;
continue;
}
struct ListNode *now = malloc(sizeof(struct ListNode));
now->val = sum;
now->next = p;
p = now;
}
if (Cout) {
struct ListNode *now = malloc(sizeof(struct ListNode));
now->val = Cout;
now->next = p;
p = now;
}
free(stack1);
free(stack2);
return p;
}
Complexity
time: O(max(m, n))
, space: O(m + n)
, while m
, n
are the length of the two lists respectively