Featured image of post 445. 两数相加 II

445. 两数相加 II

题目描述

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

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

示例 1:

  • 输入: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]

提示:

  • 链表的长度范围为 [1, 100]
  • 0 <= node.val <= 9
  • 输入数据保证链表代表的数字无前导 0

**进阶:**如果输入链表不能翻转该如何解决?

解法一:翻转链表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    var reverse func(root *ListNode) *ListNode
    reverse = func(root *ListNode) *ListNode {
        if nil == root || root.Next == nil {
            return root
        }
        newRoot := reverse(root.Next)
        root.Next.Next = root
        root.Next = nil
        return newRoot
    }
    l1, l2 = reverse(l1), reverse(l2)
    dummy := &ListNode{}
    carry, node := 0, dummy
    for l1 != nil || l2 != nil || carry != 0{
        if l1 != nil {
            carry += l1.Val
            l1 = l1.Next
        }
        if l2 != nil {
            carry += l2.Val
            l2 = l2.Next
        }
        node.Next = &ListNode{Val: carry % 10}
        node = node.Next
        carry /= 10
    }
    return reverse(dummy.Next)
}

解法二:栈

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    var stk1, stk2 []int
    for l1 != nil {
        stk1 = append(stk1, l1.Val)
        l1 = l1.Next
    }
    for l2 != nil {
        stk2 = append(stk2, l2.Val)
        l2 = l2.Next
    }
    var prev *ListNode
    carry := 0
    for len(stk1) > 0 || len(stk2) > 0 || carry != 0 {
        if len(stk1) > 0 {
            carry += stk1[len(stk1)-1]
            stk1 = stk1[:len(stk1)-1]
        }
        if len(stk2) > 0 {
            carry += stk2[len(stk2)-1]
            stk2 = stk2[:len(stk2)-1]
        }
        prev = &ListNode{Val: carry%10, Next: prev}
        carry /= 10
    }
    return prev
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/07/03 11:20:16
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计