这题难度中等, 原因就是在实现的时候细节很多, 不容易一次性搞对. 还好这两个列表表示的整数是反过来的, 所以实现上可以边遍历边相加, 只需要在累加每一位的时候记得记住进位即可.
C++单向列表定义如下:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
当然, 还有更笨的方法, 就是先把每个列表转换成数字, 然后想加再把结果换成列表.
我们需要创建一个dummy结点, 记住, 在函数返回的时候返回 dummy.next (下一个节点)即可. 算法复杂度是 O(A+B) 其中A和B分别是两个输入列表的长度.
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head = new ListNode(0), *prev = head;
int c = 0;
while (l1 != NULL || l2 != NULL) {
int sum = c + (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
c = sum / 10;
prev->next = new ListNode(sum % 10);
prev = prev->next;
if (l1) l1 = l1->next;
if (l2) l2 = l2->next;
}
if (c > 0) {
prev->next = new ListNode(c);
}
return head->next;
}
};
英文: Coding Exercise – Add Two Numbers on Singly-Linked List
C/C++编程
- 理解C++中的std::transform_reduce及示例
- 使用原子 TAS 指令实现自旋锁
- C++中检测编译时与运行时: if consteval 与 std::is_constant_evaluated()
- C++ 转发引用: 完美转发的关键
- 理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型
- C与C++: restrict关键字及其在编译器优化中的作用
- C++的左值/lvalue, 右值/rvalue和右值引用/rvalue references
- C++中的assert和static_assert的区别
- C++: auto_ptr智能指针被弃用
- C++中的consteval是什么? 它与const和constexpr有何不同?
- C++ 教程: 用std::move来移动所有权
- C++中的 const和constexpr 比较
- 简易教程: C++的智能指针
- C++ 编程练习题: 如何合并两个二叉树?
- C++ 编程练习题 - 找出第三大的数
- C++ 编程练习题 - 最多连续的 1
- C++ 编程练习题 - 左子树叶节点之和 (深度优先+广度优先+递归)
- C++ 编程练习题 - 最多水容器 (递归)
- C++的异步编程: std::future, std::async 和 std::promise
- C编程练习题: 翻转整数位
- C++编程练习题: 找出字符串的所有大小小组合
- C/C++ 中的内存管理器(堆与栈)
- C++编程练习题: 对两单向链表求和
上一篇: C编程练习题: 判断整数是否有连续两个1
下一篇: C编程练习题: 翻转整数位
扫描二维码,分享本文到微信朋友圈

最近写好多C++技术贴.
嗯, 其实这个和穿衣打扮风格随着年龄变化类似, 就是有时候觉得生活琐事也不想唠叨出来了, 哎, 人真的老了.
写写专业方面的也不错, 说不定还能帮到我这种编程小白呢