版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Forlogen/article/details/84678542
题目描述:
给定两个非空的链表,要求从头将两个列表中的值相加,并将结果存储到另一个列表中。
这里主要处理的一个问题就是两个数相加的进位问题!我们直到列表中元素的取值范围在[0 - 9],那么最大的两个元素相加9+9=18,这时进位为1,所以可以看出进位的取值范围为[0 - 1]。
AC代码:
class Solution{
public:
//法1
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2){
//存储一个存储结果的列表,初始化头部为-1
ListNode *res = new ListNode(-1);
//cur指向列表的头部
ListNode *cur = res;
//初始化进位为0
int carry = 0;
//遍历l1和l2,直到全部为空
while (l1 != NULL || l2 != NULL){
//相加
int n1 = l1 ? l1->val : 0;
int n2 = l2 ? l2->val : 0;
int sum = n1 + n2 + carry;
//更新进位,若sum > 10,则carry = 1
carry = sum / 10;
//将取余的结果存储到新节点中
cur->next = new ListNode(sum % 10);
//指针后移
cur = cur->next;
//当不为空时,指针后移,继续运算
if (l1)
l1 = l1->next;
if (l2)
l2 = l2->next;
}
//计算最后一位时,若存在进位,则添加新的节点
if (carry)
cur->next = new ListNode(1);
return res->next;
}
//法2
ListNode *addTwoNumbers(ListNode *l1,ListNode *l2){
ListNode *dummy = new ListNode(0);
ListNode *pos = dummy;
int carry = 0;
//计算直到其中某一个列表为空
while(l1 != NULL && l2 != NULL){
int sum = l1->val + l2->val + carry;
carry = sum / 10;
pos->next = new ListNode(sum % 10);
l1 = l1->next;
l2 = l2->next;
pos = pos->next;
}
//继续计算非空的那个列表
while(l1 != NULL){
int sum = l1->val + carry;
carry = sum / 10;
pos->next = new ListNode(sum % 10);
l1 = l1->next;
pos = pos->next;
}
while(l2 != NULL){
int sum = l2->val + carry;
carry = sum / 10;
pos->next = new ListNode(sum % 10);
l2 = l2->next;
pos = pos->next;
}
//处理最后的进位
if(carry != 0)
pos->next = new ListNode(carry);
return dummy->next;
}
};
参见:
【LeetCode】2. Add Two Numbers 解题报告
2. Add Two Numbers Solution