美文网首页
两数相加

两数相加

作者: 路过_720a | 来源:发表于2020-02-25 23:27 被阅读0次

    题目描述:
      给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
      如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
      您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

    解题思路:
      非空链表意味着一定会有加法运算,不存在直接返回某个链表的可能;逆序存储刚好符合加法低位对齐从低到高的计算顺序(正序需要压栈再计算);每个节点存储一位数字的话,契合了加法按每位运算的规则。
      先处理两条链表的加法,然后处理较长的链表剩下的数据。需要注意的是,在这个逻辑之后,还要判断进位是否为1,因为可能处理完两条链表之后还有进位值没有处理,我开始就在这上面犯了错误。

    //Definition for singly-linked list.
    type ListNode struct {
        Val  int
        Next *ListNode
    }
    
    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
        head := &ListNode{}
        tail := head
        carry, sum  := 0, 0
    
        for ; nil != l1 && nil != l2; l1, l2 = l1.Next, l2.Next {
            sum = carry + l1.Val + l2.Val
            if sum > 9 {
                carry = 1
                sum = sum - 10
            } else {
                carry = 0
            }
    
            node := &ListNode{
                Val:  sum,
                Next: nil,
            }
            tail.Next = node
            tail = node
        }
    
        for ; nil != l1; l1 = l1.Next {
            sum = carry + l1.Val
            if sum > 9 {
                carry = 1
                sum = sum - 10
            } else {
                carry = 0
            }
            node := &ListNode{
                Val:  sum,
                Next: nil,
            }
            tail.Next = node
            tail = node
        }
    
        for ; nil != l2; l2 = l2.Next {
            sum = carry + l2.Val
            if sum > 9 {
                carry = 1
                sum = sum - 10
            } else {
                carry = 0
            }
            node := &ListNode{
                Val:  sum,
                Next: nil,
            }
            tail.Next = node
            tail = node
        }
    
        //等长链表最后一位的进位
        //或者长的一条链表剩余部分是“999”数字产生进位
        if 1 == carry {
            node := &ListNode{
                Val:  1,
                Next: nil,
            }
            tail.Next = node
            tail = node
        }
        return head.Next
    }
    

      查看题解后,发现第一个for循环的条件可以改为(nil != l1) || (nil != l2), 在循环中推进每个链表,这样只需一个循环就可以完成题目了。

    相关文章

      网友评论

          本文标题:两数相加

          本文链接:https://www.haomeiwen.com/subject/cmlcchtx.html