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)
遇到这种题目,我的一般思路是先做问题分解,找到最小子问题 —— 单个数字相加并进位。于是就有了上面递归的解法:先处理好边界,然后再做运算,递归,得到结果。
痕迹
没有过去,就没法认定现在的自己