前言
有空的时候就用scala刷一些题,熟悉一下scala和FP编程,也算复习算法。
思路
题目是两数相加,用链表表示一个整数,每个节点一个数字。
trick是相加之后的之后一个数字如果大于等于10就要新加一个节点。
看到题目想到可以用scala的高阶函数来进行操作。
题解
函数式
使用zip操作,zip又叫拉链,像拉链一样,把两个有序集合按序一对对拼在一起,形成一个Tuple。
比如1
2
3
4
5val a = List(1, 2, 3)
val b = List("a", "b", "c", "d")
val c = a.zip(b)
//List[(Int, String)] = List((1,a), (2,b), (3,c))
但是zip操作一般是应用于两个相同长度的列表。它会把两个不同长度的列表,按照较短的那个列表进行截断。
这时候就需要用到 zipAll方法,它可以补全较短的列表,按照较长的列表的长短来进行拉链操作,这样就需要传入两个用于补充长度的默认值参数。zipAll(B, aa, bb)
其中 aa 是前一个列表的默认值,bb 是第二个列表的默认值。1
2val d = a.zipAll(b, 0, "T")
//List[(Int, String)] = List((1,a), (2,b), (3,c), (0,d))
然后在应用 reduceLeft来合并节点
1 | object AddTwoNumbers { |
这样执行用时是 3148 ms。好像有点久,换过程式方法试试看。
过程式
1 | def addTwoNumbers(l1: ListNode, l2: ListNode): ListNode = { |
这样执行用时也要 2232 ms。应该还是有不少改进空间。