Lever's Castle

2. 两数相加

October 19, 2019

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

使用语言:Golang

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    return _addTwoNumbers(l1, l2, 0)
}


func _addTwoNumbers(l1 *ListNode, l2 *ListNode, plus int) *ListNode {
    if l1 == nil {
        if l2 == nil {
            if plus > 0 {
                return &ListNode{Val:plus}
            }
            return nil
        }
        return _addTwoNumbers(l2, nil, plus)
    }
    res := &ListNode{}
    l2Val := 0
    var l2Next *ListNode
    if l2 != nil {
        l2Val = l2.Val
        l2Next = l2.Next
    }
    
    res.Val = l1.Val + l2Val + plus
    if res.Val > 9 {
        res.Val = res.Val - 10
        plus = 1
    } else {
        plus = 0
    }
    res.Next = _addTwoNumbers(l1.Next, l2Next, plus)
    return res
}

解题思路:

最简单,最直接的办法:分别遍历两个链表,算出对应的十进制数字,对结果进行加法运算,再将运算结果转成链表。

这种方法非常直观,不太容易写出 bug 来,但是需要遍历两次链表,最后还要把数字转成链表,时间复杂度较高 —— O(3n)

遇到这种题目,我的一般思路是先做问题分解,找到最小子问题 —— 单个数字相加并进位。于是就有了上面递归的解法:先处理好边界,然后再做运算,递归,得到结果。


Lever

痕迹
没有过去,就没法认定现在的自己