美文网首页
两数相加

两数相加

作者: 路过_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), 在循环中推进每个链表,这样只需一个循环就可以完成题目了。

相关文章

  • 两数相加

    题目 You are given two non-empty linked lists representing ...

  • 两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • 两数相加

    两数相加 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一...

  • 两数相加

    两数相加: 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回...

  • 两数相加

    题目 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新...

  • 两数相加

    题目描述: 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回...

  • 两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • 两数相加

    问题链接:https://leetcode-cn.com/explore/interview/card/top-i...

  • 两数相加

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...

  • 两数相加

    题目描述 给定一个整数数组nums 和一个目标值target,请你在该数组中找出和为目标值的那 两个 整数,并返回...

网友评论

      本文标题:两数相加

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