【发布时间】:2020-06-26 15:51:03
【问题描述】:
我想在 Leetcode 上为以下问题写一个尾递归解决方案 -
给定两个代表两个非负整数的非空链表。数字以相反的顺序存储,它们的每个节点都包含一个数字。将两个数字相加并作为链表返回。
你可以假设这两个数字不包含任何前导零,除了数字 0 本身。
例子:
*Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)*
*Output: 7 -> 0 -> 8*
*Explanation: 342 + 465 = 807.*
Link to the problem on Leetcode
我无法找到在最后一行调用递归函数的方法。 我在这里试图实现的是递归调用 add 函数,该函数将两个列表的头部添加一个进位并返回一个节点。返回的节点与调用堆栈中的节点链接在一起。
我对 scala 很陌生,我猜我可能错过了一些有用的构造。
/**
* Definition for singly-linked list.
* class ListNode(_x: Int = 0, _next: ListNode = null) {
* var next: ListNode = _next
* var x: Int = _x
* }
*/
import scala.annotation.tailrec
object Solution {
def addTwoNumbers(l1: ListNode, l2: ListNode): ListNode = {
add(l1, l2, 0)
}
//@tailrec
def add(l1: ListNode, l2: ListNode, carry: Int): ListNode = {
var sum = 0;
sum = (if(l1!=null) l1.x else 0) + (if(l2!=null) l2.x else 0) + carry;
if(l1 != null || l2 != null || sum > 0)
ListNode(sum%10,add(if(l1!=null) l1.next else null, if(l2!=null) l2.next else null,sum/10))
else null;
}
}
【问题讨论】:
-
顺便说一句,似乎 LeetCode 并不适合 Scala,它们使用标准库 中的数据结构(像这样NodeList) 并且他们的大部分问题都有望以命令式的方式解决(这不是 Scala 中的规范)。如果您的最终目标是学习 Scala,则最好使用 Scala Exercises 或 99 Scala Problems。
标签: algorithm scala linked-list tail-recursion