题目描述:具体描述见原题。简单来说就是以链表形式存储两个十进制表示的数字,并用链表存储两数字求和的值。
解题思路:按照常规加法思路计算即可,题目中数字本身是逆序存储,所以不需要考虑反转链表。稍微需要注意的问题是循环计算过程中进位处理,第N轮进位值可在第N-1轮加和时更新,详细过程见代码注释。
具体代码:
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
r := &ListNode{} // 初始化返回值头
h := r
c := 0 // 初始化进位值
for l1 != nil || l2 != nil || c != 0 {
s := c // 初始化本轮进位值,参与加和
if l1 != nil { // 如果l1对应位置不为空,需要参与加和
s += l1.Val
l1 = l1.Next
}
if l2 != nil{ // 如果l2对应位置不为空,需要参与加和
s += l2.Val
l2 = l2.Next
}
r.Next = &ListNode{
Val: s % 10, // 本轮加和值结果在当前位上显示值(处理方法就是加法进位)
}
r = r.Next
c = s / 10 // 更新下一轮进位值
}
return h.Next
}
补充说明:提交完成后显示内存消耗只超过了70%提交记录。也许理想的解法是将结果值覆盖l1或者l2,这样就不需要额外存储链表了。欢迎留言。