[Leetcode题解]2. 两数相加-链表遍历和重构
1. 审题leetcode 02 add-two-numbers
我们先看一下题目,如下 :
链表的从前往后为数字的低位到高位,模拟加法手算过程,从前往后遍历即可, 注意每个数字0-9,进位要处理好;
2. 解体思路
主要分4步来完成,增加一个头节点来处理后续的添加过程可能简单些;
- 处理l1 和 l2 共有元素的累加, 注意进位inc的累加;
- 处理多余的l1的内容;
- 处理多余的l2的内容;
- 处理最后剩余的进位;
3. 详细代码
3.1 直观的循环代码
1 /**
2 * Definition for singly-linked list.
3 * type ListNode struct {
4 * Val int
5 * Next *ListNode
6 * }
7 */
8
9 func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
10 var inc int
11 head := ListNode{0, nil}
12 lastNode := &head
13 for ; l1 != nil && l2 != nil; l1, l2 = l1.Next, l2.Next {
14 sum := l1.Val + l2.Val + inc
15 if sum >= 10 {
16 inc = 1
17 sum -= 10
18 } else {
19 inc = 0
20 }
21 temp := ListNode{sum, nil}
22 lastNode.Next = &temp
23 lastNode = &temp
24 }
25 for ; l1 != nil; l1 = l1.Next {
26 sum := l1.Val + inc
27 if sum >= 10 {
28 inc = 1
29 sum -= 10
30 } else {
31 inc = 0
32 }
33 temp := ListNode{sum, nil}
34 lastNode.Next = &temp
35 lastNode = &temp
36 }
37 for ; l2 != nil; l2 = l2.Next {
38 sum := l2.Val + inc
39 if sum >= 10 {
40 inc = 1
41 sum -= 10
42 } else {
43 inc = 0
44 }
45 temp := ListNode{sum, nil}
46 lastNode.Next = &temp
47 lastNode = &temp
48 }
49 if inc != 0 {
50 temp := ListNode{inc, nil}
51 lastNode.Next = &temp
52 lastNode = &temp
53 }
54 return head.Next
55 }
3.2 函数提炼重构
每个计算过程都包含取出两个数字,和进位一起求和,处理大于10的数字,继续下一轮;故抽取关键函数完成这个节点的处理
1 func addSumNode(n1 int, n2 int, inc int, lastNode *ListNode) (int, *ListNode) {
2 sum := n1 + n2 + inc
3 if sum >= 10 {
4 inc = 1
5 sum -= 10
6 } else {
7 inc = 0
8 }
9 temp := ListNode{sum, nil}
10 lastNode.Next = &temp
11 lastNode = &temp
12 return inc, lastNode
13 }
14
15 func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
16 var inc int
17 head := ListNode{0, nil}
18 lastNode := &head
19 for ; l1 != nil && l2 != nil; l1, l2 = l1.Next, l2.Next {
20 inc, lastNode = addSumNode(l1.Val, l2.Val, inc, lastNode)
21 }
22 for ; l1 != nil; l1 = l1.Next {
23 inc, lastNode = addSumNode(l1.Val, 0, inc, lastNode)
24 }
25 for ; l2 != nil; l2 = l2.Next {
26 inc, lastNode = addSumNode(0, l2.Val, inc, lastNode)
27 }
28 if inc != 0 {
29 inc, lastNode = addSumNode(0, 0, inc, lastNode)
30 }
31 return head.Next
32 }
4. 感悟总结
要重构代码不是特别难做的事情, 看到两次以上的重复就要有所警觉, 尝试提取公共部分,或者进一步优化代码整体结构, 你会发现代码是越来越容易懂,后续添加新需求也实现其来更加容易,更好复用,所以, 重构无小事, 重构也“不是难做的大事”,因为重构也就在点滴中; 小步快跑才是重构的精髓;
重构后代码看起来清爽很多, 55LOC => 32 LOC
运行时间对比:
执行用时:16 ms, 在所有 Go 提交中击败了39.76% 的用户
内存消耗:4.9 MB, 在所有 Go 提交中击败了21.00% 的用户 # 重构后
执行用时:12 ms, 在所有 Go 提交中击败了72.62% 的用户
内存消耗:4.9 MB, 在所有 Go 提交中击败了26.81% 的用户
永久地址: https://mp.weixin.qq.com/s/5OZx7i-oOGvDbxCWHPxi5A 已收录到公众号,欢迎关注 :)

[Leetcode题解]2. 两数相加-链表遍历和重构的更多相关文章
- LeetCode | No.2 两数相加
题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- LeetCode :2.两数相加 解题报告及算法优化思路
题目连接:2.两数相加 题意 题目难度标为 中等, 因为题意上有一部分理解难度,以及需要数据结构的链表基础. 还不知道到链表的童鞋可以粗略的看下百度百科或者是翻出数据结构的书看一看,通俗一点的语言来解 ...
- LeetCode刷题--两数相加(中等)
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- LeetCode Golang 2. 两数相加
2. 两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
- 两数相加[链表加法] LeetCode.2
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- Leetcode:2. 两数相加
题目描述: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...
- leetCode刷题 | 两数相加
给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...
- LeetCode练习2 两数相加
问题如下: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来 ...
- 【LeetCode】2. 两数相加
题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
随机推荐
- C#开发PACS医学影像处理系统(二):界面布局之菜单栏
在菜单栏布局上,为了使用自定义窗体样式和按钮,我们需要先将窗体设置为无边框,然后添加一个Grid作为菜单栏并置顶,VerticalAlignment="Top" logo图片和标题 ...
- Java面试炼金系列 (1) | 关于String类的常见面试题剖析
Java面试炼金系列 (1) | 关于String类的常见面试题剖析 文章以及源代码已被收录到:https://github.com/mio4/Java-Gold 0x0 基础知识 1. '==' 运 ...
- Python解答蓝桥杯省赛真题之从入门到真题(二刷题目一直更新)
蓝桥刷题 原文链接: https://github.com/libo-sober/LanQiaoCup Python解答蓝桥杯省赛真题之从入门到真题 不同字串 """ 一 ...
- 第16课 - make的隐式规则(下)
第16课 - make的隐式规则(下) 1
- MyBatis常用实现方式
MyBatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动.创建连接.创建 statement 等繁杂的过程 ...
- Module build failed: TypeError: this.getResolve is not a function at Object.loader 使用vue-cli 创建项目 使用sass时报错 -- 等其他sass 报错 ./node_modules/css-loader?{"sourceMap":true}!./node_modules/vue-loader/lib
已经安装了 sass相关依赖包 npm install sass-loader --save-devnpm install node-sass --sava-dev 并且在build文件下webpa ...
- IDEA—使用插件反编译jar包
关注微信公众号:CodingTechWork,一起学习进步. 引言 在产品上线后,如果遇到问题阻塞,我们第一步要做的就是去查看日志,但是代码不是一个人写的,说不定就会遇到没有日志的,遇到这种情况, ...
- 吴恩达-机器学习+Logistic回归分类方案
- 你来讲讲AQS是什么吧?都是怎么用的?
前言 在Java面试的时候,多线程相关的知识是躲不掉的,肯定会被问.我就被问到了AQS的知识,就直接了当的问,AQS知道是什么吧,来讲讲它是怎么实现的,以及哪些地方用到了它.当时自己确实没有讲好,所以 ...
- python_用户登录验证
登录验证,三次机会,如何做? 1. 一个用户列表记录合法密码和用户名,一个小黑屋列表记录输错3次的用户, 一个中间列表记录所有用户输入,统计某个用户是否输错3次 2. 通过 in 判断一个元素是否在一 ...