題目
兩數(shù)相加
給出兩個(gè) 非空 的鏈表用來表示兩個(gè)非負(fù)的整數(shù)。其中荠列,它們各自的位數(shù)是按照 逆序 的方式存儲(chǔ)的类浪,并且它們的每個(gè)節(jié)點(diǎn)只能存儲(chǔ) 一位 數(shù)字。
如果肌似,我們將這兩個(gè)數(shù)相加起來费就,則會(huì)返回一個(gè)新的鏈表來表示它們的和。
您可以假設(shè)除了數(shù)字 0 之外锈嫩,這兩個(gè)數(shù)都不會(huì)以 0 開頭受楼。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思路
首先想到需要對(duì)鏈表進(jìn)行循環(huán)取值,如何循環(huán)呢呼寸,for-in 是不行了艳汽,那么就想到用while 來循環(huán)。
由于是需要取2個(gè)鏈表的值对雪,循環(huán)條件就需要是2個(gè)同時(shí)來判斷河狐。然后每次取子鏈表判斷,最后代碼如下
代碼:
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var returnLn: ListNode?
var ln1 = l1
var ln2 = l2
var addNum = 0
var ln: ListNode?
while ln1 != nil || ln2 != nil {
let tuple = listNode(ln1, ln2, addNum)
addNum = tuple.0
if returnLn == nil {
ln = tuple.1
returnLn = ln
} else {
ln!.next = tuple.1
ln = ln!.next
}
ln1 = ln1?.next
ln2 = ln2?.next
}
return returnLn
}
func listNode(_ l1: ListNode?, _ l2: ListNode?, _ addNum: Int) -> (Int, ListNode) {
let l1Val = l1?.val ?? 0
let l2Val = l2?.val ?? 0
let num = addNumber(l1Val, l2Val, addNum)
let ln = ListNode.init(num.1)
return (num.0, ln)
}
func addNumber(_ num1: Int, _ num2: Int, _ num3: Int) -> (Int, Int) {
let num = num1 + num2 + num3
if num >= 10 {
return (1, num - 10)
} else {
return (0, num)
}
}
結(jié)果是有一個(gè)用例錯(cuò)了瑟捣,鏈表是 5 和 5 的時(shí)候輸出了 0 馋艺,而不是 0 -> 1
所以需要在循環(huán)結(jié)束后加上2個(gè)都為空的判斷。加上下面代碼后迈套,通過捐祠,用時(shí) 60 ms,戰(zhàn)勝 92.46 % swift 提交記錄
代碼:
if ln1 == nil && ln2 == nil && addNum > 0 {
ln!.next = ListNode.init(addNum)
}
最后完成的代碼鏈接