LeetCode - 兩數相加 - Swift
阿新 • • 發佈:2018-11-07
感謝此作者
在這個基礎上添加了一些註釋,讓以後的我能看懂。
還有未解決的地方。以後有時間在解決。
問題:
* 如何測試陣列。現在只能單個文字的測試。
import UIKit
public class ListNode {
public var val: Int
public var next: ListNode?
public init(_ val: Int) {
self.val = val
self.next = nil
}
}
class WYSolution: NSObject {
func getValFromNode(_ node: ListNode?) -> Int {
if node == nil {
return 0
} else {
return node!.val
}
}
func getNextNode(_ node: ListNode?) -> ListNode? {
if node != nil {
return node!.next
} else {
return nil
}
}
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
// 1. 判斷是否為空,如都為空,返回 nil
if (l1 == nil) && (l2 == nil) {
return nil
}
var ll1 = l1
var ll2 = l2
// 表頭 設定為 0
let head = ListNode(0)
// 要對頭結點進行操作時,考慮建立啞節點,這樣可以避免處理頭節點為空的邊界問題。
var point = head
// 將進位 carry 初始化為 0
var carry = 0
while (ll1 != nil) || (ll2 != nil) || carry != 0 {
// 獲取相加值
let total = getValFromNode(ll1) + getValFromNode(ll2) + carry
/*
由於每位數字都應當處於 0...9 的範圍中,我們計算兩個數字的和時可能會出現 “溢位”
例: 5 + 7 = 12
這種情況,會將當前數值設定為2, 並將進位 carry = 1 帶入下次迭代。
*/
point.val = total % 10
// 更新進位的值
// 進位carry 必定是 0 或 1, 因為 兩個數字相加 ,考慮進位,可能出現的最大和 為 9 + 9 + 1 = 19
carry = total / 10
// 如果已經到達 末尾,則將其值設定為 0
ll1 = getNextNode(ll1)
ll2 = getNextNode(ll2)
if (ll1 != nil) || (ll2 != nil) || (carry != 0) {
point.next = ListNode(0)
point = point.next!
}
}
return head
}
}
複雜度分析
時間複雜度:
- O(max(m,n)),假設 m 和 n 分別表示 l1 和 l2 的長度,上面的演算法最多重複 max(m,n) 次。
空間複雜度:
- O(max(m,n)), 新列表的長度最多為 max(m,n)+1。