func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
l1List, l2List := getList(l1), getList(l2)
l, r, in := len(l1List)-1, len(l2List)-1, 0
result := &ListNode{}
cur := result
for l >= 0 || r >= 0 {
left := 0
if l >= 0 {
left = l1List[l]
l--
}
right := 0
if r >= 0 {
right = l2List[r]
r--
}
sum := left + right + in
in = sum / 10
cur = &ListNode{
Val: sum % 10,
}
if result.Next != nil {
cur.Next = result.Next
}
result.Next = cur
}
if in != 0 {
cur = &ListNode{
Val: in,
}
if result.Next != nil {
cur.Next = result.Next
}
result.Next = cur
}
return result.Next
}
func getList(n *ListNode) []int {
result := make([]int, 0)
for n != nil {
result = append(result, n.Val)
n = n.Next
}
return result
}
当然可以做一些性能优化:
Go复制代码
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
l1List, l2List := make([]int, 0), make([]int, 0)
for l1 != nil || l2 != nil {
if l1 != nil {
l1List = append(l1List, l1.Val)
}
if l2 != nil {
l2List = append(l2List, l2.Val)
}
if l1 != nil {
l1 = l1.Next
}
if l2 != nil {
l2 = l2.Next
}
}
in := 0
result := &ListNode{}
for len(l1List) > 0 || len(l2List) > 0 {
left := 0
if len(l1List) > 0 {
left = l1List[len(l1List)-1]
l1List = l1List[:len(l1List)-1]
}
right := 0
if len(l2List) > 0 {
right = l2List[len(l2List)-1]
l2List = l2List[:len(l2List)-1]
}
sum := left + right + in
in = sum / 10
result.Next = &ListNode{
Val: sum % 10,
Next: result.Next,
}
}
if in != 0 {
result.Next = &ListNode{
Val: in,
Next: result.Next,
}
}
return result.Next
}