2023-07-03每日一题
一、题目编号
445. 两数相加 II
二、题目链接
三、题目描述
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
提示:
- 链表的长度范围为 [1, 100]
- 0 <= node.val <= 9
- 输入数据保证链表代表的数
四、解题代码
/**
* 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) {
int carry = 0;
ListNode * head1 = l1;
while(l1->next != nullptr && l2->next != nullptr){
int temp = (l1->val+l2->val+carry);
l1->val = temp%10;
carry = temp/10;
l1 = l1->next;
l2 = l2->next;
}
if(l1->next == nullptr){
int temp = (l1->val+l2->val+carry);
l1->val = temp%10;
carry = temp/10;
if(l2->next == nullptr){
if(carry == 1){
l1->next = new ListNode(1);
l1->next->next = nullptr;
}
}
else{
l1->next = l2->next;
l1 = l1->next;
while(l1 ->next != nullptr){
int temp = l1->val+carry;
l1->val = temp%10;
carry = temp/10;
l1 = l1->next;
}
if(l1->val == 9 && carry ==1){
l1->val = 0;
l1->next = new ListNode(1);
l1->next->next = nullptr;
}
else{
l1->val += carry;
}
}
}
else{
int temp = (l1->val+l2->val+carry);
l1->val = temp%10;
carry = temp/10;
l1 = l1->next;
while(l1 ->next != nullptr){
int temp = l1->val + carry;
l1->val = temp % 10;
carry = temp / 10;
l1 = l1->next;
}
if(l1->val == 9 && carry == 1){
l1->val = 0;
l1->next = new ListNode(1);
l1->next->next = nullptr;
}
else{
l1->val += carry;
}
}
return head1;
}
ListNode* reverseList(ListNode* &head) {
ListNode *node = head;
if(head == nullptr){
return nullptr;
}
while(node->next != nullptr){
node = node->next;
}
ListNode *node1 = head;
while(node1 != node){
node1 = node1->next;
head->next = node->next;
node->next = head;
head = node1;
}
return node;
}
ListNode* addTwoNumbers(ListNode *l1, ListNode *l2) {
ListNode* L1 = reverseList(l1);
ListNode* L2 = reverseList(l2);
ListNode* res = AddTwoNumbers(L1, L2);
return reverseList(res);
}
};
五、解题思路
(1) 首先先将两个链表翻转,这样就是低位在前面了。
(2) 这样题目就转化为昨天的题目,两数相加了,详细可以看昨天的题目。
(3) 最后再将相加后的链表反转,这样就成了高位在前面的结果数组了。