Leetcode 2:两数相加(最详细解决方案!!!)
发布日期:2021-06-29 16:00:43
浏览次数:2
分类:技术文章
本文共 2314 字,大约阅读时间需要 7 分钟。
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807
解题思路
首先想到的解决思路是将链表中的数转化为数据类型,然后加起来(可能会发生越界问题),再转化为链表。
class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ def get_num(l): num = 0 t = 1 while l != None: l, val = l.next, l.val num += val*t t *= 10 return num l3 = get_num(l1) + get_num(l2) ret = t = ListNode(0) if l3 == 0: return ret while l3 != 0: n = l3 % 10 t.next = ListNode(n) t = t.next l3 //= 10 return ret.next
但是这个解法是如此的丑陋!!!
那么能不能不把链表中的数据转化为ListNode
,而直接在它的基础上进行加法呢?我们这样去做的话,会遇到这样的一个问题,当两个数的和大于10
的时候,他们相加的结果就会进位,所以要解决的问题就是这个进位问题。
class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ cur = ret = ListNode(0) add = 0 while l1 or l2 or add: val = (l1.val if l1 else 0) + (l2.val if l2 else 0) + add add = val // 10 cur.next = ListNode(val % 10) cur = cur.next l1 = l1.next if l1 else None l2 = l2.next if l2 else None return ret.next
我们通过添加一个变量add
去记录这个进位的值。这样我们的代码变得比之前简洁了很多。
我在这里同时给出对应的c++
版本。
class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* dumHead = new ListNode(0); ListNode* p = dumHead; int add = 0; while (l1 || l2 || add) { int val = get_value(l1) + get_value(l2) + add; add = val / 10; p->next = new ListNode(val % 10); p = p->next; l1 = get_p(l1); l2 = get_p(l2); } ListNode* ret = dumHead->next; delete dumHead; return ret; }private: int get_value(ListNode* l) { if (l != nullptr) return l->val; else return 0; } ListNode* get_p(ListNode* l) { if (l != nullptr) return l->next; return nullptr; }};
我将该问题的其他语言版本添加到了我的
如有问题,希望大家指出!!!
转载地址:https://coordinate.blog.csdn.net/article/details/80435080 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月20日 15时51分29秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
超详细Spring Boot面试问题集锦,死角一个不留!
2019-04-29
10个业余时间可完成的项目,助你飞速提升编码能力!
2019-04-29
网络爬虫初涉——用python爬取网络小说
2019-04-29
Pycharm+tensorflow dropout 学习(三)
2019-04-29
Pycharm+tensorflow CNN 学习(四)
2019-04-29
用python暴力破解压缩包密码
2019-04-29
基于OpenCV 将图片进行预处理,转变为MNIST图片格式
2019-04-29
PyCharm+Tensorflow CNN调用训练好的模型进行预测 (五)
2019-04-29
物联网平台Node-red初涉——访问搭建的简易服务器
2019-04-29
2020-10-27
2019-04-29
OpenCV+python识别并打印HSV颜色
2019-04-29
2021-03-29
2019-04-29
网络攻击与防御--引言
2019-04-29
网络攻击与防御--网络协议漏洞
2019-04-29
sql注入: 判断注入点类型
2019-04-29
千人千面Elasticsearch实战学习笔记
2019-04-29
最大子数组问题(递归)(java)
2019-04-29
2021年第十二届蓝桥杯软件赛省赛第二场 C/C++ 大学 A 组
2019-04-29
2020年哨兵数据批量下载(USGS)
2019-04-29
简单3步快速生成千万级别mysql测试数据库,模拟电商数据
2019-04-29