2. 两数相加

77 阅读1分钟

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例 1:

输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.

示例 2:

输入: l1 = [0], l2 = [0]
输出: [0]

示例 3:

输入: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出: [8,9,9,9,0,0,0,1]

 

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

思路

  1. 使用哑节点统一头结点处理
  2. 使用一个整型记录进位
  3. 遍历处理完所有节点
  4. 别忘了最后处理进位

代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    var dummy, tail *ListNode
    dummy = new(ListNode)
    tail = dummy

    var sum, adder int
    for l1 != nil || l2 != nil {
        sum = 0
        if l1 != nil {
            sum += l1.Val
            l1 = l1.Next
        }
        if l2 != nil {
            sum += l2.Val
            l2 = l2.Next
        }
        
        sum += adder
        adder = 0
        if sum > 9 {
            sum -= 10
            adder = 1
        }

        newNode := &ListNode{Val: sum}
        tail.Next = newNode
        tail = tail.Next
    }

    if adder != 0 {
        newNode := &ListNode{Val: 1}
        tail.Next = newNode
        tail = tail.Next
    }

    return dummy.Next
}

图示

image.png