2. 两数相加

作者: 花果山松鼠 | 来源:发表于2018-07-06 17:40 被阅读1次

一、题目原型:

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。

二、题目意思剖析:

将数字反过来,再相加,然后再逆序存起来。

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

三、解题思路:

官方解析:

1.将当前节点初始化为返回列表的哑节点。
2.将进位 carry 初始化为 0。
3.将 p 和 q 分别初始化为列表 l1 和 l2 的头部。
4.遍历列表 l1和 l2 直至到达它们的尾端。
5.将 x 设为节点 p 的值。如果 p 已经到达 l1的末尾,则将其值设置为0。
6.将 y 设为节点 q 的值。如果 q 已经到达 l2 的末尾,则将其值设置为0。
7.设定 sum=x+y+carry。更新进位的值,carry=sum/10。
8.创建一个数值为 (sum余10) 的新节点,并将其设置为当前节点的下一个节点,然后将当前节点前进到下一个节点。
9.同时,将 p 和 q 前进到下一个节点。检查 carry=1 是否成立,如果成立,则向返回列表追加一个含有数字 1 的新节点。返回哑节点的下一个节点。

我的理解:

其实由繁化简来说,就是保存sum的余数和sum的除数,也就是看看它是否超过了10,这有一个特殊处理。
比如 5 + 8 = 13,13 / 10 = 1,13 % 10 = 3。那其实就变成了3 -> 1
curr是先加余数,再加进位的那个1。

思路
// 1.链表构造
public class ListNode {
    public var val: Int
    public var next: ListNode?
    public init(_ val: Int) {
        self.val = val
        self.next = nil
    }
}
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    
    let dummyHead: ListNode? = ListNode.init(0)
    var p: ListNode? = l1
    var q: ListNode? = l2
    var curr: ListNode? = dummyHead
    
    var carray: Int = 0
    while (p != nil) || (q != nil) {
        let x: Int = (p != nil) ? (p?.val)! : 0
        let y: Int = (q != nil) ? (q?.val)! : 0
        let sum: Int = carray + x + y
        carray = sum / 10
        curr?.next = ListNode.init(sum % 10)
        curr = curr?.next
        if (p != nil) {
            p = p?.next
        }
        if (q != nil) {
            q = q?.next
        }
    }
    if carray > 0 {
        curr?.next = ListNode.init(carray)
    }
    return dummyHead?.next
}

四、小结

有时候抓住关键点就可以一击突破。这题的关键就在于处理sum的余数和除数。

总提交数.png
提交结果.png

有任何疑问都可以留言,非常乐意一起探讨。😄

相关文章

  • 2. 两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • 2. 两数相加

  • 2. 两数相加

    一、题目原型: 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加...

  • 2. 两数相加

    题目 解析 本题只需要遍历一下单链表,将单链表的值添加到StringBuilder对象后然后转化成数字进行运算再反...

  • 2.两数相加

    题目 思路1.记录返回结构体2.两个结构体的两位数相加,记录进位3.位移结构体,赋值代码

  • 2. 两数相加

    https://leetcode-cn.com/problems/add-two-numbers/descript...

  • 2. 两数相加

    补充:我们现在的这种第一个节点是头节点。所以要 root.next如果我的 不想用这种方式 会遇到这样的问题。

  • 2. 两数相加

    链接:https://leetcode-cn.com/problems/add-two-numbers/ 代码地址...

  • 2.两数相加

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...

  • 2. 两数相加

    题目 分析 解题方案: 初等数学 我们使用变量来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。 就像你...

网友评论

    本文标题:2. 两数相加

    本文链接:https://www.haomeiwen.com/subject/gnrbuftx.html