描述
本题是力扣的445. 两数相加 II
考点
-
链表的合并
题解
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> list1, list2;
while (l1 != nullptr) {
list1.push(l1->val);
l1 = l1->next;
}
while (l2 != nullptr) {
list2.push(l2->val);
l2 = l2->next;
}
int carry = 0;
ListNode *dummyHead = new ListNode(-1);
while (!list1.empty() || !list2.empty() || carry) {
carry += !list1.empty() ? list1.top() : 0;
carry += !list2.empty() ? list2.top() : 0;
if (!list1.empty()) list1.pop();
if (!list2.empty()) list2.pop();
ListNode *node = new ListNode(carry % 10, dummyHead->next);
dummyHead->next = node;
carry /= 10;
}
return dummyHead->next;
}
};
思路
按照算术逻辑,运算应该从低位到高位,同时用一个变量carry
记录进位
那么新节点的值就等于 「(对应位之和+上一次运算的carry
)取余10」, 进位carry
的值就等于 「(对应位之和+上一次运算的carry
)除以10」
故而正常思维,两个链表先反转并作运算,新的节点以头插的方式连接,这样就保证了逆序
class Solution {
private:
ListNode* reverseFunc(ListNode* head) {
//头插法反转链表
ListNode *dummyHead = new ListNode(-1, head), *tail = head;
while (tail->next != nullptr) {
ListNode *node = tail->next;
tail->next = node->next;
node->next = dummyHead->next;
dummyHead->next = node;
}
return dummyHead->next;
}
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *dummyHead = new ListNode(-1);
l1 = reverseFunc(l1);
l2 = reverseFunc(l2);
int carry = 0;
while (l1 != nullptr || l2 != nullptr || carry) {
carry += l1 != nullptr ? l1->val : 0;
carry += l2 != nullptr ? l2->val : 0;
//头插法新建链表即逆序
ListNode *node = new ListNode(carry % 10, dummyHead->next);
dummyHead->next = node;
carry /= 10;
l1 = l1 != nullptr ? l1->next : nullptr;
l2 = l2 != nullptr ? l2->next : nullptr;
}
return dummyHead->next;
}
};
但是题目竟然要求不反转链表?那就只能用栈了,代码如题解所示
两个链表的值先入栈,保证低位对低位;每次对应位出栈做运算,新的节点同样以头插的方式连接保证逆序
更多
恭喜你完成本题!
你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/
仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!
看官若还满意,还请Star一下哟~
关注公众号峰狂算法
,获取最新的刷题指导呀~