题意
给定两个链表,代表数字的相反次序,求这两个链表加起来的和。用链表存储结果。
思路
算法1
在原来的位置上存储,利用原来的空间,于是需要判断一下哪个链表先到终点等。
算法2
很简洁的一个写法,我们假设链表的长度相同,如果一个为空了我们认为是0。
并且,在处理头结点的时候,我们刚开始新建一个不用的头结点p,每次求和的值保存在p->next = new ListNode(val)
。
最后结果将p后移一位即可。
代码
algorithm 1
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* add(ListNode *l1, ListNode *l2) {
ListNode *p = l1, *q = l2, *pre1 = p, *pre2 = q;
int adc = 0;
while (p && q) {
p->val += (q->val + adc);
if (p->val >= 10) {
p->val %= 10;
adc = 1;
} else {
adc = 0;
}
pre1 = p; pre2 = q;
p = p->next;
q = q->next;
}
if (p && !q) {
while (p && adc) {
p->val += adc;
if (p->val >= 10) {
p->val %= 10;
adc = 1;
} else {
adc = 0;
}
pre1 = p;
p = p->next;
}
} else if (!p && q) {
while (q) {
q->val += adc;
if (q->val >= 10) {
q->val %= 10;
adc = 1;
} else {
adc = 0;
}
pre1->next = q;
pre1 = pre1->next;
q = q->next;
}
}
if (adc) pre1->next = new ListNode(adc);
return l1;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
return add(l1, l2);
}
};
algorithm 2
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int adc = 0;
ListNode *head = new ListNode(0), *p = head;
while (l1 || l2 || adc) {
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + adc;
adc = sum / 10;
p->next = new ListNode(sum % 10);
p = p->next;
l1 = l1 ? l1->next : l1;
l2 = l2 ? l2->next : l2;
}
return head->next;
}
};