两数相加

2020-02-25  本文已影响0人  路过_720a

题目描述:
  给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
  如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
  您可以假设除了数字 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), 在循环中推进每个链表,这样只需一个循环就可以完成题目了。

上一篇 下一篇

猜你喜欢

热点阅读