阅读 38

LeetCode 刷题笔记 - 2. 两数相加

难度:

中等

描述:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 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
    }
}
复制代码

总结

这里用到的链表是最初级的操作,挺有意思的,其他没啥太大难度。