1. 链表两数相加
https://leetcode-cn.com/problems/add-two-numbers/
思路:可以将大问题分解为子问题,子问题和大问题逻辑相同只是规模不同, 存在终止条件,也就是当前结点都为空且进位为0时, 可以使用递归
终止条件:当前结点都为空且进位为0时
递推公式:
int new_val = (val1 + val2 + carry) % 10;
carry = (val1 + val2 + carry) / 10;
ListNode* curr = new ListNode(new_val);
curr->next = fun(next1, next2, carry);
/**
* 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 {
private:
ListNode* fun(ListNode* l1, ListNode* l2, int carry) {
// 1 终止条件
if (l1 == nullptr && l2 == nullptr && 0 == carry) return nullptr;
// 2 正式处理
// 2.1 准备
int val1, val2;
ListNode *next1, *next2;
if (l1) {
val1 = l1->val;
next1 = l1->next;
}
else {
val1 = 0;
next1 = nullptr;
}
if (l2) {
val2 = l2->val;
next2 = l2->next;
}
else {
val2 = 0;
next2 = nullptr;
}
// 2.2 关键逻辑
int new_val = (val1 + val2 + carry) % 10;
carry = (val1 + val2 + carry) / 10;
ListNode* curr = new ListNode(new_val);
curr->next = fun(next1, next2, carry);
return curr;
}
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
return fun(l1, l2, 0);
}
};
时间复杂度O(n)空间复杂度O(n)