难度:
中等
描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ad… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
语言:
swift
解析:
这题就像在小学的时候学习笔算数学加减法。
比如计算123 + 678,首先个位相加,3 + 8 = 11,等于10 + 1,溢出了1,于是十位数相加的时候变为2 + 8 + 1 = 10,以此类推。我们可以在计算的时候都假设上一位溢出了n / 10,于是每位的计算变成了 a + b + sumFlow。
需要注意的是:首位的sumFlow值为0,在两个数字位数长度不同的时候,给短的数字高位补0,在计算到最后一位的时候,要判断是否还有上一位的sumFlow,如果有的话需要在最高位继续补上。
然后就是配合链表的使用。
代码如下:
class Solution {
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var listOne = l1, listTwo = l2, sumList = ListNode(0)
var sumFlow : Int = 0
var node = sumList
while (listOne != nil) || (listTwo != nil) {
let numberSum = (listOne?.val ?? 0) + (listTwo?.val ?? 0)
var sum = numberSum + sumFlow
if sum >= 10 {
sumFlow = sum / 10
sum = sum - 10
}
else {
sumFlow = 0
}
let listNode = ListNode(sum)
node.next = listNode
node = node.next!
listOne = listOne?.next
listTwo = listTwo?.next
}
if sumFlow > 0 {
node.next = ListNode(sumFlow)
}
return sumList.next
}
}
总结
这里用到的链表是最初级的操作,挺有意思的,其他没啥太大难度。