Add Two Numbers


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的空间这样能减少空间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值