445 两数相加-中等

题目:

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

示例1:

img

输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:

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

分析:

先讲原始链表反转,然后顺次相加。

// date 2023/12/18
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    if l1 == nil { return l2 }
    if l2 == nil { return l1 }

    l1 = reverseList(l1)
    l2 = reverseList(l2)

    v1, v2, carry := 0, 0, 0
    var res *ListNode

    for l1 != nil || l2 != nil || carry > 0 {
        v1, v2 = 0, 0
        if l1 != nil {
            v1 = l1.Val
            l1 = l1.Next
        }
        if l2 != nil {
            v2 = l2.Val
            l2 = l2.Next
        }
        temp := v1 + v2 + carry
        carry = temp / 10

        head := &ListNode{Val: temp%10}
        head.Next = res
        res = head
    }

    return res
}

func reverseList(l *ListNode) *ListNode {
    if l == nil || l.Next == nil {
        return l
    }
    var tail *ListNode
    pre := l
    for pre != nil {
        pn := pre.Next
        pre.Next = tail
        tail = pre
        pre = pn
    }
    return tail
}

最后更新于