前言
我們社區從本期開始會將顧毅(Netflix 增長黑客,《iOS 面試之道》作者,ACE 職業健身教練。微博:@故胤道長)的 Swift 算法題題解整理爲文字版以方便大家學習與閱讀。
不積跬步,無以至千里;不積小流,無以成江海,Swift社區 伴你前行。
難度水平:中等
描述
已知兩個非負整數(例如:l1 = 342,l2 = 465
),將數字分別按相反的順序存儲到鏈表中(例如:l1 = [2,4,3],l2 = [5,6,4]
),每個節點都包含一個數字,將兩個數字相加並將總和作爲鏈表返回(例如:[7,0,8]
)。
假設這兩個數字不包含任何前導零(例如:
012),除了數字 0 本身。
示例
示例 1
輸入:l1 = [2,4,3],l2 = [5,6,4]
產出:[7,0,8]
說明:342 + 465 = 807
示例 2
輸入:l1 = [0],l2 = [0]
產出:[0]
示例 3
輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
產出:[8,9,9,9,0,0,0,1]
限制
- 每個鏈表中的節點數在 [1, 100] 範圍內
- 0 <= 節點值 <= 9
- 保證列表中沒有前導零的數字
答案
/**
* 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 AddTwoNumbers {
func addTwoNumbers(l1: ListNode?, _ l2: ListNode?) -> ListNode? {
guard let l1 = l1 else {return l2}
guard let l2 = l2 else {return l1}
let outputNode = ListNode((l1.val + l2.val)%10)
if l1.val + l2.val > 9 {
outputNode.next = addTwoNumbers(addTwoNumbers(l1.next, l2.next),
ListNode(1))
} else {
outputNode.next = addTwoNumbers(l1.next, l2.next)
}
return outputNode
}
}
- 主要思想:使用進位並遍歷兩個鏈表
- 時間複雜度:O(n)
- 空間複雜度:O(1)