Add Two Numbers
题目描述
给两个非空反转链表,每个链表的元素都是单个的数字,让模拟两数相加得出结果。如(2 -> 4 -> 3) + (5 -> 6 -> 4)输出7 -> 0 -> 8。
题目思路
直接暴力模拟即可,时间复杂度为 0 ( n + m ) 0(n+m) 0(n+m),空间复杂度为 O ( m i n ( n , m ) ) O(min(n, m)) O(min(n,m))。代码如下。
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
var head ListNode
now := &head
var m int
for l1 != nil && l2 != nil {
var tmp *ListNode
tmp = new(ListNode)
//val = (l1.Val + l2.Val)
//m, v = val/10, val%10 //m为进位,v为当前数字
tmp.Val = (l1.Val + l2.Val + m) % 10
m = (l1.Val + l2.Val + m) / 10
now.Next = tmp
now = now.Next
l1 = l1.Next
l2 = l2.Next
}
//
if l1 != nil {
now.Next = l1
tmpVal := (l1.Val + m)/10
l1.Val = (l1.Val + m)%10
m = tmpVal
for m > 0 {
if l1.Next == nil {
var tmp *ListNode
tmp = new(ListNode)
l1.Next = tmp
}
l1 = l1.Next
tmpVal := (l1.Val + m)/10
l1.Val = (l1.Val + m)%10
m = tmpVal
}
}
if l2 != nil {
now.Next = l2
tmpVal := (l2.Val + m)/10
l2.Val = (l2.Val + m)%10
m = tmpVal
for m > 0 {
if l2.Next == nil {
var tmp *ListNode
tmp = new(ListNode)
l2.Next = tmp
}
l2 = l2.Next
tmpVal := (l2.Val + m)/10
l2.Val = (l2.Val + m)%10
m = tmpVal
}
}
if m > 0 {
var tmp *ListNode
tmp = new(ListNode)
tmp.Val = 1
now.Next = tmp
}
return head.Next
}
看网上其他的go代码相对简洁一些。
第一份代码,思路是先将两个数以及进位相加到对应sums,然后赋给新的节点,循环下去即可。时间复杂度为O(n+m),空间复杂度为0(n+m)。
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
result := &ListNode{}
current := result
each_sums := 0
for l1 != nil || l2 != nil || each_sums != 0{
if l1 != nil{
each_sums += l1.Val
l1 = l1.Next
}
if l2 != nil{
each_sums += l2.Val
l2 = l2.Next
}
current.Next = &ListNode{Val: each_sums % 10}
each_sums /= 10
current = current.Next
}
return result.Next
}
其实还可以复用L1或者L2的空间这样能减少空间复杂度。