设置哑结点,插入适当结点
左边到右边都是个位数开始, 所以进行模拟加法即可
- 得到 位数值 注意:当指针指向空时 我们认为 此时值为0 便于处理
- 进行加法模拟
- 特殊情况分析 当两边结点扫描完 需要加入新结点时
例子
250 + 750, 需要多加1位 最高位
复杂度分析
空间复杂度 O(1)
时间复杂度 O(N)
代码
/**
* 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) {
// dummy 哑结点 插入适当结点
// 左边到右边都是个位数开始, 所以进行模拟加法即可
// if l1 or l2 == nullptr l1 l2 = 0
// if l1 + l2 + jinwei <= 10 :
// 加入 l1 + l2
// jinwei = 0
// else :
// 加入 l1 + l2 + jinwei % 10
// jinwei = 1
ListNode* dummy = new ListNode(-1);
ListNode* end = dummy;
int x1 = 0, x2 = 0, ifadd = 0;
//x1 x2 表示相加的值 当指针指向空时 我们认为 此时 值为0 便于处理
while (l1 != nullptr || l2 != nullptr) {
if (l1 == nullptr) {
x1 = 0;
} else {
x1 = l1->val;
l1 = l1->next;
}
if (l2 == nullptr) {
x2 = 0;
} else {
x2 = l2->val;
l2 = l2->next;
}
cout << x1 << x2 << endl;
if (x1 + x2 + ifadd < 10) {
end->next = new ListNode(x1 + x2 + ifadd);
ifadd = 0;
} else {
end->next = new ListNode((x1 + x2 + ifadd)%10);
ifadd = 1;
}
end = end->next;
}
//特色情况分析 当结点扫描完 需要加入新结点时
if (ifadd != 0) {
end->next = new ListNode(1);
end = end->next;
}
return dummy->next;
}
};
心得
开始还想着 先把两个 数字提取出来
后面看例子发现 , 之所以给我们倒叙就是, 想让我们模拟加法操作
-
实现过程中 依然用dummy 结点 来处理 没有结点的问题, 然后往链表里面尾加元素
尾加元素
end->next = new ListNode(1); end = end->next;
-
巧妙的把 扫描到空的点 认为他的值为0, 避免了很多异常情况