leetcode-2
leetcode-2
题面:
原题:https://leetcode-cn.com/problems/add-two-numbers/submissions/
思路:题目并不要求求出两数相加的结果,只要求结果的各个数字,所以不要用+运算符,会溢出,一位一位的加即可
重点:
- 需要考虑输入的某一个链表为NULL的情况
- 需要考虑输入的两个链表长度不一致的情况
- 需要考虑输入的两个链表长度一致、最后一位加完之后还有进位的情况
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode* result = new ListNode();
ListNode* tResult = result;
//处理某一个列表为空的特殊情况
if(l1== nullptr)
{
result = l2;
return result;
}
if(l2 == nullptr)
{
result = l1;
return result;
}
int v1 = l1->val;
int v2 = l2->val;
int sum = 0;
int carry = 1;
int i=0;
//必须加上carry>0的条件,因为可能两个列表长度相同,最后一位加完之后还有进位
while((l1 != nullptr) || (l2 != nullptr) || carry>0 )
{
if(l1 !=nullptr && l2!=nullptr )
{
int tv1 = l1->val;
int tv2 = l2->val;
//这个地方处理的很不优雅,不过GCC应该能做好分支预测吧。。。
if(i==0){
sum = (tv1+tv2)%10;
tResult->val = sum;
carry = (tv1+tv2)/10;
}
else{
sum = (tv1+tv2+carry)%10;
tResult->val = sum;
carry = (tv1+tv2+carry)/10;
}
l1 = l1->next;
l2 = l2->next;
if(l1!=nullptr || l2!=nullptr || carry>0)
{
tResult->next = new ListNode();
tResult = tResult->next;
}
}
//需要考虑两个链表长度不一致的情况
else if(l1 != nullptr){
int tv1 = l1->val;
sum = (tv1+carry)%10;
carry = (tv1+carry)/10;
tResult->val = sum;
l1 = l1->next;
if(l1 != nullptr || carry>0)
{
tResult->next = new ListNode();
tResult = tResult->next;
}
}
//需要考虑两个链表长度不一致的情况
else if(l2!=nullptr){
int tv2 = l2->val;
sum = (tv2+carry)%10;
carry = (tv2+carry)/10;
tResult->val = sum;
l2 = l2->next;
if(l2 !=nullptr || carry>0)
{
tResult->next = new ListNode();
tResult = tResult->next;
}
}
else{
tResult->val = carry;
carry = 0;
}
i++;
}
return result;
}
};