[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. 两数相加
题目 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
随机推荐
- sql注入--bool盲注,时间盲注
盲注定义: 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 布尔盲注: 布尔盲注只有true跟false,也就是说它根据你的注入信息 ...
- CTF-BugKu-杂项-29-33
2020.09.15 今天换个新壁纸,换个新背景音乐,燃起来 做题 第二十九题 论剑 https://ctf.bugku.com/challenges#论剑 图片详情没啥信息,不是正方形,考虑改成正方 ...
- JS 浏览器BOM
BOM:Browser Object Model 浏览器对象模型 2.组成: window :窗口对象 1.创建: 2.方法: *与弹出框有关 1.alert(); 弹出警告框 2.confirm() ...
- vue2.5开发去哪儿了流程
初始化项目 在 src/assets 中添加样式初始化文件 reset.css ; border.css 本地引入取消延迟300毫秒的控件 cnpm i fastclick -S 在mian.js中引 ...
- StarUML 3.1.0 for Windows 10
StarUML 3.1.0 for Windows 10 1.下载 StarUML 3.1.0 http://staruml.io/download 2.安装 npm 到官网下载安装 windows版 ...
- 【Java并发编程】synchronized相关面试题总结
目录 说说自己对于synchronized关键字的了解 synchronized关键字的三种使用 synchronized关键字的底层原理 JDK1.6之后对synchronized关键字进行的优化 ...
- java 单例模式的几种写法
一.懒汉式 public class Singleton{ private static Singleton instance = null; private Singleton(){} public ...
- 获取NX一组属性
NX中的属性是可以分组的,有时我们想获取某一个组下的所有属性,但是NX封装的接口不够好用,因此在此基础上,我封装了一个,供大家参考: 1 //属性值是字符串类型,obj对象tag,category组名 ...
- 刷题[HFCTF2020]EasyLogin
前置知识 node.js koa框架常用目录,文件 js弱类型语言,空数组与整数1比较时,返回turue jwt令牌 博客讲解: 关于jwt的讲解: http://www.ruanyifeng.com ...
- Spring Cloud系列(二):Eureka应用详解
一.注册中心 1.注册中心演变过程 2.注册中心必备功能 ① 服务的上线 ② 服务的下线 ③ 服务的剔除 ④ 服务的查询 ⑤ 注册中心HA ⑥ 注册中心节点数据同步 ⑦ 服务信息的存储,比如mysql ...