我正在快速练习Leetcode问题。
我面临关于可选的问题,我理解这个概念。
但我不知道什么是正确的表达。
我实现了链接列表问题,没有问题但是当我检查链表包含答案时我遇到了问题。
这里链表会添加两个值(没问题)
// Definition for singly-linked list.
public 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? {
var carry = 0
var sum = 0
let head = ListNode(0)
var temp = head
var l1 = l1
var l2 = l2
while (l1 != nil)||(l2 != nil)||(carry != 0) {
if l1 != nil{
sum += l1!.val
l1 = l1?.next
}
if l2 != nil{
sum += l2!.val
l2 = l2?.next
}
carry = sum / 10
sum = sum%10
let newNode = ListNode(sum)
temp.next = newNode
temp = temp.next!
sum = carry
}
return head.next
}
}
链接列表包含值
var l1 = ListNode(2)
l1.next = ListNode(4)
l1.next?.next = ListNode(3)
l1.next?.next?.next = ListNode(9)
var l2 = ListNode(5)
l2.next = ListNode(6)
l2.next?.next = ListNode(4)
带问题的代码(遍历链表以显示链表中包含的值)
var a = Solution()
while( a.addTwoNumbers(l1, l2)?.next != nil){
print(l1.val)
//optional value error with a question mark.
l1 = l1.next?
}
print (l1.val)
我收到了这个错误:
错误:day2_Add两个Numbers.playground:126:13:错误:可选类型的值' ListNode?'没有打开;你的意思是使用'!'或者'?'? l1 = l1.next ^ !
我知道最后一个问号不应该被执行,因为它是一个可选值。
但是有错误。
请让我理解原因,请告诉我如何纠正。 (请使用可选的链接或绑定)
答案 0 :(得分:0)
因为.next可以是零。让l1和l2是可选的。
如此。
var l1:ListNode? = ListNode(2)
l1?.next = ListNode(4)
l1?.next?.next = ListNode(3)
l1?.next?.next?.next = ListNode(9)
var l2:ListNode? = ListNode(5)
l2?.next = ListNode(6)
l2?.next?.next = ListNode(4)
var a = Solution()
var l3 = a.addTwoNumbers(l1, l2)
while l3 != nil {
print(l3?.val) // or print(l3!.val) because we sure it is not nil.
l3 = l3?.next
}
更新: 我修复了你的遍历代码。 addTwoNumbers结果应首先保存在单独的变量中,然后遍历它。 (在我的情况下是l3)