题目链接
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int64
* public var next: ?ListNode
* public init() {
* val = 0
* next = None
* }
* public init(val: Int64) {
* this.val = val
* next = None
* }
* }
*/
class Solution {
func addTwoNumbers(l1: ?ListNode, l2: ?ListNode): ?ListNode {
var p = l1
var q = l2
var needPlus1 = false
var nextNeedPlus1 = false
var res:ListNode = ListNode(0)
var tmp:ListNode = res
while(true){
var needBreak = true
var num:Int64 = 0
if(p?.val != None){
needBreak = false
num += (p??throw Exception("222")).val
p = (p??break).next
}
if(q?.val != None){
needBreak = false
num += (q??throw Exception("333")).val
q = (q??break).next
}
if(nextNeedPlus1){
needPlus1 = true
nextNeedPlus1 = false
}
if(needPlus1){
needPlus1 = false
num += 1
}
if(num >= 10){
nextNeedPlus1 = true
num -= 10
}
if(needBreak){
if(num != 0){
tmp.next = ListNode(1)
tmp = (tmp.next??throw Exception("444"))
}
break
}
tmp.next = ListNode(num)
tmp = (tmp.next??throw Exception("555"))
}
return res.next
}
}
遇到的问题
1、while循环不知道怎么写
官网给出的写法是
但是如果我直接写while(p <- None)会报错
也看不懂,所以采用类似线程的while(1)写法了
2、判断子节点是否为空
通过的写法是
if(p?.val != None)
和arkTS一样需要?
一下
如果想用next来判断,不知道怎么写,说是p和q的类型是Option,所以不匹配,然后if仅接受bool
3、num赋值
num += (p??throw Exception("222")).val
如果直接用num += p.val
则会报错,还是那句话,p和q是option,所以需要用??
来解构(华为官网文档)
复杂度
时间复杂度 O(max(len(l1), len(l2)))
空间复杂度 O(1)(不算结果空间)
结果
https://leetcode.cn/problems/add-two-numbers/submissions/574515701