解法一:
递归方式
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (l1 == NULL || l2 == NULL) {
return l1 == NULL ? l2 : l1;
}
int value = l1->val + l2->val;
ListNode* result = new ListNode(value % 10);
result->next = addTwoNumbers(l1->next, l2->next);
if (value >= 10) {
result->next = addTwoNumbers(new ListNode(value / 10), result->next);
}
return result;
}
};
解法二:
两个链表对应位相加,如果一个链表为空,则在其后面补0继续计算,直到两个链表都为空。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (l1 == NULL || l2 == NULL) {
return l1 == NULL ? l2 : l1;
}
ListNode *temp = new ListNode(0);
ListNode *result = temp;
int carry = 0;
int remainder = 0;
while (l1 && l2) {
remainder = (l1->val + l2->val + carry) % 10; // 余数
carry = (l1->val + l2->val + carry) / 10; // 进位
temp->next = new ListNode(remainder);
l1 = l1->next;
l2 = l2->next;
temp = temp->next;
if (l1 == NULL && l2 == NULL) {
break;
}
if (l1 == NULL)
l1 = new ListNode(0);
if (l2 == NULL)
l2 = new ListNode(0);
}
if (carry != 0)
temp->next = new ListNode(carry);
return result->next;
}
};
解法三
摘自『九章算法』的答案。
将过程分为三个子过程,先将两个链表等长度部分的数字之和计算出来,直到一个链表为空。此时如果l1不为空,则将l1链表的值与“进位”相加再取余做为下一个结果元素的值,直到计算至l1也为空,l2不为空时同理。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (l1 == NULL || l2 == NULL) {
return l1 == NULL ? l2 : l1;
}
ListNode *result = new ListNode(0);
ListNode *temp = result;
int sum = 0;
int carry = 0;
while (l1 && l2) {
sum = carry + l1->val + l2->val;
temp->next = new ListNode(sum % 10);
carry = sum / 10;
l1 = l1->next;
l2 = l2->next;
temp = temp->next;
}
while (l1) {
sum = carry + l1->val;
temp->next = new ListNode(sum % 10);
carry = sum / 10;
l1 = l1->next;
temp = temp->next;
}
while (l2) {
sum = carry + l2->val;
temp->next = new ListNode(sum % 10);
carry = sum / 10;
l2 = l2->next;
temp = temp->next;
}
if (carry != 0)
temp->next = new ListNode(carry);
return result->next;
}
};
本文介绍了解决两数相加问题的三种链表实现方法。第一种使用递归方式,第二种通过补零处理不同长度链表的情况,第三种则针对等长与不等长链表提供了解决方案。
181

被折叠的 条评论
为什么被折叠?



