给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
一次解答:
/**
* 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
* }
* }
*/
extension ListNode {
public func getLast() -> ListNode? {
var tempListNote: ListNode? = self
while tempListNote?.next != nil {
tempListNote = tempListNote!.next
}
return tempListNote
}
public func arr() -> [Int] {
var arr: [Int] = []
arr.append(val)
guard self.next != nil else {
return arr
}
var node: ListNode? = self
while node?.next != nil {
node = node!.next
arr.append(node!.val)
}
return arr
}
}
class Solution {
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
let l1Arr = l1?.arr() ?? []
let l2Arr = l2?.arr() ?? []
let smallArr: [Int]
let bigArr: [Int]
if l1Arr.count < l2Arr.count {
smallArr = l1Arr
bigArr = l2Arr
} else {
smallArr = l2Arr
bigArr = l1Arr
}
var result: ListNode?
var moreThanTen = false
func addNum(num1: Int, num2: Int) -> Int {
let result = num1 + num2 + (moreThanTen ? 1 : 0)
if result >= 10 {
moreThanTen = true
return result - 10
} else {
moreThanTen = false
return result
}
}
for i in 0..<bigArr.count {
var num1: Int = 0
let num2: Int = bigArr[i]
var num: Int = 0
if i < smallArr.count {
num1 = smallArr[i]
num = addNum(num1: num1, num2: num2)
} else {
num = addNum(num1: 0, num2: num2)
}
if result == nil {
result = ListNode.init(num)
} else {
result?.getLast()?.next = ListNode.init(num)
}
}
if moreThanTen {
result?.getLast()?.next = ListNode.init(1)
}
return result
}
}
执行结果:通过
执行用时 : 64 ms
在所有 Swift 提交中击败了54.10%的用户
内存消耗 :20.6 MB, 在所有 Swift 提交中击败了70.73%的用户
嗯.很一般的成绩
思考:
实战项目中可以通过实现subscript方法实现下标的取值
description属性重载日志输出
增加append、insert、removeAll、remove、removeLast方法快速访问元素,在方法内进行方法优化,这里因为是解题不做过多用不上的方法的实现
网友评论