这题难度中等, 原因就是在实现的时候细节很多, 不容易一次性搞对. 还好这两个列表表示的整数是反过来的, 所以实现上可以边遍历边相加, 只需要在累加每一位的时候记得记住进位即可.
C++单向列表定义如下:
1 2 3 4 5 | struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; |
struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };
当然, 还有更笨的方法, 就是先把每个列表转换成数字, 然后想加再把结果换成列表.
我们需要创建一个dummy结点, 记住, 在函数返回的时候返回 dummy.next (下一个节点)即可. 算法复杂度是 O(A+B) 其中A和B分别是两个输入列表的长度.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; } }; |
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
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK