Golang学习之路 - LeetCode-Go-Learning 第二题. 两数相加

鸣谢: LeetCode-In-Go

2. Add Two Numbers

题目

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

思考过程:

解题思路

(2 -> 4 -> 3)是 342

(5 -> 6 -> 4)是 465

(7 -> 0 -> 8)是 807

342 + 465 = 807

所以,题目的本意是,把整数换了一种表达方式后,实现其加法。

设计程序时候,需要处理的点有

  1. 位上的加法,需要处理进位问题
  2. 如何进入下一位运算
  3. 按位相加结束后,也还需要处理进位问题。

总结

读懂题意后,按步骤实现题目要求。

解法 1 按思路

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

// 第一种解题思路:
/*
1. 设置一个进位,每一位计算进位的数字并加入到下一次计算当中去。
2. 共同遍历链表每一位,然后判断当前每个链表是否还有数字判断位数。
3. 结果链表判断进位和相加的关系。
*/


func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    resPre := &ListNode{}
    cur := resPre   // 结果链表处理
    carry := 0     // 进位
    
    for l1 != nil || l2 != nil || carry > 0 {
        cur_sum := carry
        if l1 != nil {
            cur_sum += l1.Val
            l1 = l1.Next
        }
        
        if l2 != nil {
            cur_sum += l2.Val
            l2 = l2.Next
        }
        
        carry = cur_sum / 10
        
        cur.Next = &ListNode{Val: cur_sum % 10}
        cur = cur.Next
    }
    return resPre.Next
}

解法 2 LeetCode 参考解法

此解法每次运行时间不确定。
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    if l2 == nil {
        l2 = &ListNode{}
    }
    
    current:=&ListNode{Next:l2}
    for l1 != nil {
        carray := 0
        carray = (l1.Val+l2.Val)/10
        l2.Val = (l1.Val+l2.Val)%10
        if carray > 0 {
            if l2.Next == nil {
                l2.Next =  &ListNode{}
            }
            l2.Next.Val += carray
            n := l2.Next
            for n != nil {
                carray = n.Val/10
                n.Val = n.Val%10
                if carray > 0 {
                    if n.Next == nil {
                        n.Next =  &ListNode{}
                    }
                    n.Next.Val += carray
                } else {
                    break
                }
                n = n.Next
            }
        }
        l1 = l1.Next
        if l1 == nil {
            break
        }
        if l2.Next == nil {
            l2.Next =  &ListNode{}
        }
        l2 = l2.Next
    }
    
    return current.Next
}

本地编写测试程序

package problem0002

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

type para struct {
	one *ListNode
	two *ListNode
}

type ans struct {
	one *ListNode
}

type question struct {
	p para
	a ans
}

func makeListNode(is []int) *ListNode {
	if len(is) == 0 {
		return nil
	}

	res := &ListNode{
		Val: is[0],
	}
	temp := res

	for i := 1; i < len(is); i++ {
		temp.Next = &ListNode{Val: is[i]}
		temp = temp.Next
	}

	return res
}

func Test_OK(t *testing.T) {
	ast := assert.New(t)

	qs := []question{
		question{
			p: para{
				one: makeListNode([]int{2, 4, 3}),
				two: makeListNode([]int{5, 6, 4}),
			},
			a: ans{
				one: makeListNode([]int{7, 0, 8}),
			},
		},
		question{
			p: para{
				one: makeListNode([]int{9, 8, 7, 6, 5}),
				two: makeListNode([]int{1, 1, 2, 3, 4}),
			},
			a: ans{
				one: makeListNode([]int{0, 0, 0, 0, 0, 1}),
			},
		},
		question{
			p: para{
				one: makeListNode([]int{0}),
				two: makeListNode([]int{5, 6, 4}),
			},
			a: ans{
				one: makeListNode([]int{5, 6, 4}),
			},
		},
	}

	for _, q := range qs {
		a, p := q.a, q.p
		ast.Equal(a.one, addTwoNumbers(p.one, p.two), "输入:%v", p)
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值