第二题:(网上借鉴)
1.边界情况:
两个链表都为空 或其中一个为空
2.思路:
一般这种涉及两个链表的题目都会创建一个辅助用的头节点(即自己创建一个结点,这里我称为pre)
从个位开始把两个链表相加的结果保存到pre中,(具体实现就是一位一位向前加,最后加完了在遍历一遍pre链表解决进位)
这里有个增加这个submissions百分比的小技巧(即加入以下代码)
static const auto _____ = []()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
算法代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(!l1 || (l1 && !l1->next && l1->val == 0))
return l2;
if(!l2 || (l2 && !l2->next && l2->val == 0))
return l1;
ListNode *res = new ListNode(-1);
res->next = l1;
ListNode *it = NULL;
int carry = 0;
while(l1 && l2) {
int val = carry + l1->val + l2->val;
// carry = 0;
if(val <=9) {
l1->val = val;
carry = 0;
} else {
carry = val/10;
val = val%10;
l1->val = val;
}
if(!l1->next && l2->next)
it = l1;
l1 = l1->next;
l2 = l2->next;
}
if(l2) {
it->next = l2;
it = it->next;
}
if(l1) {
it = l1;
}
ListNode *tail = NULL;
while(it) {
int val = it->val + carry;
if(val <= 9) {
it->val = val;
carry = 0;
} else {
carry = val/10;
val = val%10;
it->val = val;
}
it = it->next;
}
if(carry) {
tail = res;
while(tail->next) {
tail = tail->next;
}
tail->next = new ListNode(carry);
}
return res->next;
}
};
static const auto _____ = []()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
-------wang
-------568551096@qq.com