李洪强iOS经典面试题34-求两个链表表示的数的和

问题

给你两个链表,分别表示两个非负的整数。每个链表的节点表示一个整数位。

为了方便计算,整数的低位在链表头,例如:123 在链表中的表示方式是:

3 -> 2 -> 1

现在给你两个这样结构的链表,请输出它们求和之后的结果。例如:

输入: (2 -> 4 -> 1) + (5 -> 6 -> 1)
输出: 7 -> 0 -> 3

代码模版

本题的 Swift 代码模版如下:

private class ListNode {
   public var val: Int
   public var next: ListNode?
   public init(_ val: Int) {
       self.val = val
       self.next = nil
   }
} class Solution {
   func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?)
        -> ListNode? {    }
}

考查点

本题出自 LeetCode 上的第 2 题。

这是我高中学习编程时最早接触的一类题目,我们把这类题目叫做「高精度计算」,其实就是在计算机计算精度不够时,模拟我们在纸上演算的方式来计算答案,然后获得足够精度的解。

我还记得我 7 年前第一次去网易有道面试的时候,就考查的是一道类似的高精度计算题目,比这道题复杂得多,我当时用了一个比较笨的办法,加上当时还是用 C++ 写的,内存分配和释放写起来也比较麻烦,最后写了两页 A4 纸才写完。

这道题其实完全不考查什么「算法」,人人都知道怎么计算,但是它考察了「将想法转换成代码」的能力,新手通常犯的毛病就是:意思都明白,但是写不出来代码。所以,这类题目用来过滤菜鸟确实是挺有效的办法。

答案

本题的做法其实没什么特别,就是直接计算。计算的时候需要考虑到以下这些情况:

  1. 两个整数长度不一致的情况。

  2. 进位的情况。当进位产生时,我们需要保存一个标志位,以便在计算下一位的和的时候,加上进位。

  3. 当计算完后,如果还有进位,需要处理最后结果加一位的情况。

以下是完整的代码,我使用了一些 Swift 语言的特性,比如用 flatMap 来减少对于 Optional类型值为 nil 的判断。

private class ListNode {
   public var val: Int
   public var next: ListNode?
   public init(_ val: Int) {
       self.val = val
       self.next = nil
   }
} private class Solution {    private func getNodeValue(_ node: ListNode?) -> Int {
       return node.flatMap { $0.val } ?? 0
   }    func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?)
            -> ListNode? {
       if l1 == nil || l2 == nil {
           return l1 ?? l2
       }
       var p1 = l1
       var p2 = l2
       let result: ListNode? = ListNode(0)
       var current = result
       var extra = 0
       while p1 != nil || p2 != nil || extra != 0 {
           var tot = getNodeValue(p1) +
                     getNodeValue(p2) + extra
           extra = tot / 10
           tot = tot % 10
           let sum:ListNode? = ListNode(tot)
           current!.next = sum
           current = sum
           p1 = p1.flatMap { $0.next }
           p2 = p2.flatMap { $0.next }
       }
       return result!.next
   }
}

以上代码也可以从我的 Gist 中找到:https://gist.github.com/tangqiaoboy/af0dc9a45dd309e91436b44b76eab5f1

偷偷告诉你一个小秘密,Gist 里面的代码我稍微修改了两行,最终性能就从打败 LeetCode 10% 的提交变成了打败 LeetCode 50% 的提交,如果你感兴趣,可以自己仔细对比一下。

愿大家玩得开心~

李洪强iOS经典面试题34-求两个链表表示的数的和的更多相关文章

  1. 李洪强iOS经典面试题144-数据存储

    李洪强iOS经典面试题144-数据存储   数据存储 sqlite中插入特殊字符的方法和接收到处理方法. 除'其他的都是在特殊字符前面加"/",而 ' -> '' .方法:k ...

  2. 李洪强iOS经典面试题下

    李洪强iOS经典面试题下 21. 下面的代码输出什么? @implementation Son : Father - (id)init { self = [super init]; if (self) ...

  3. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  4. 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)

    李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...

  5. 李洪强iOS经典面试题154- 通知与推送

    李洪强iOS经典面试题154- 通知与推送   通知与推送 本地通知和远程推送通知对基本概念和用法? image 本地通知和远程推送通知都可以向不在前台运行的应用发送消息,这种消息既可能是即将发生的事 ...

  6. 李洪强iOS经典面试题153- 补充

    李洪强iOS经典面试题153- 补充   补充 有空就来解决几个问题,已经懒癌晚期没救了... UML 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模 ...

  7. 李洪强iOS经典面试题147-WebView与JS交互

    李洪强iOS经典面试题147-WebView与JS交互   WebView与JS交互 iOS中调用HTML 1. 加载网页 NSURL *url = [[NSBundle mainBundle] UR ...

  8. 李洪强iOS经典面试题143-绘图与动画

    李洪强iOS经典面试题143-绘图与动画   绘图与动画 CAAnimation的层级结构 CAPropertyAnimation是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使 ...

  9. 李洪强iOS经典面试题142-第三方框架及其管理

    李洪强iOS经典面试题142-第三方框架及其管理   第三方框架及其管理 使用过CocoaPods吗?它是什么?CocoaPods的原理? CocoaPod是一个第三方库的管理工具,用来管理项目中的第 ...

  10. 李洪强iOS经典面试题141-报错警告调试

    李洪强iOS经典面试题141-报错警告调试   报错警告调试 你在实际开发中,有哪些手机架构与性能调试经验 刚接手公司的旧项目时,模块特别多,而且几乎所有的代码都写在控制器里面,比如UI控件代码.网络 ...

随机推荐

  1. WebSocket原理分析

    Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应用可以良好支撑,但对于实时要求高.海量 ...

  2. 解决Windows server 2012 R2 系统使用IIS8浏览Asp程序出现"An error occurred on the server when processing the URL"错误

    进入IIS并将ASP里的“Send Error To Browser”设置为True后点击Appley保存即可 原因是IIS里的Asp设置禁用上当错误信息发送给浏览器,只要启用即可 如果没有Asp选项 ...

  3. (剑指Offer)面试题57:删除链表中的重复结点

    题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 ...

  4. ! Undefined control sequence. \CJK@XXX ...endcsname {`#2}{`#3}\CJK@ignorespaces \fi l.43 \end{document}

    错误的原因是:你的文本内容超过了一页,需要增加新的一页. 解决问题的方法就是在\end{CJK}或者\end{CJK*}之前加入\newpage,\clearpage或者\cleardoublepag ...

  5. JAVA学习目录

    开发环境以及IDE准备相关: 1.JAVA环境搭建 2.初次使用IntelliJ IDEA 3.IntelliJ IDEA界面设置 4.IntelliJ IDEA快捷键介绍 SprintBoot系列: ...

  6. Python list删除元素

    pop()方法 pop(n) 从list删除元素Paul同学刚来几天又要转走了,那么我们怎么把Paul 从现有的list中删除呢?如果Paul同学排在最后一个,我们可以用list的pop()方法删除: ...

  7. ant design pro (十五)advanced 使用 API 文档工具

    一.概述 原文地址:https://pro.ant.design/docs/api-doc-cn 在日常开发中,往往是前后端分离的,这个时候约定好一套接口标准,前后端各自独立开发,就不会被对方的技术难 ...

  8. [Android exception] /data/app/com.tongyan.tutelage-1/lib/arm/libstlport_shared.so: has text relocations

    java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.tongyan.tutelage-1/lib/arm/libstlport_s ...

  9. 【划分树+二分】HDU 4417 Super Mario

    第一次 耍划分树.. . 模板是找第k小的 #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

  10. 基于canvas的仪表盘效果

    概述 基于Canvas实现的仪表盘及效果.通过配置参数,可以任意修改仪表盘颜色,刻度,动画过渡时间等,满足不同场景下的使用.同时使用原生的Canvas,也是学习Canvas的很好的例子. 详细 代码下 ...