剑指offer025-链表中的两数相加

链表中的两数相加

Posted by 高明 on 2020-01-01

剑指offer025-链表中的两数相加

题目

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

可以假设除了数字 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

 

进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。

 

注意:本题与主站 445 题相同:https://leetcode-cn.com/problems/add-two-numbers-ii/

Related Topics
  • 链表
  • 数学

  • 👍 18
  • 👎 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    if (l1 == null || l2 == null) {
    return null;
    }
    List<Integer> arr1 = new ArrayList<>();
    List<Integer> arr2 = new ArrayList<>();
    while (l1 != null) {
    arr1.add(l1.val);
    l1 = l1.next;
    }

    while (l2 != null) {
    arr2.add(l2.val);
    l2 = l2.next;
    }

    List<Integer> res = addTwoNumbers(arr1, arr2);

    ListNode p = new ListNode(res.get(0));
    ListNode t = p;
    for (int i = 1; i < res.size(); i++) {
    t.next = new ListNode(res.get(i));
    t = t.next;
    }
    return p;
    }

    public List<Integer> addTwoNumbers(List<Integer> arr1, List<Integer> arr2) {
    int m = arr1.size();
    int n = arr2.size();
    int left = m - 1;
    int right = n - 1;
    int d = 0;
    List<Integer> res = new ArrayList();
    while (left >= 0 && right >= 0) {

    int v = d + arr1.get(left) + arr2.get(right);
    int s = v % 10;
    res.add(s);
    d = v / 10;
    left--;
    right--;
    }

    while (left >= 0) {
    int v = d + arr1.get(left);
    int s = v % 10;
    res.add(s);
    d = v / 10;
    left--;
    }

    while (right >= 0) {
    int v = d + arr2.get(right);
    int s = v % 10;
    res.add(s);
    d = v / 10;
    right--;
    }

    if (d > 0) {
    res.add(d);
    }

    List<Integer> res2 = new ArrayList();

    for (int i = res.size() - 1; i >= 0; i--) {
    res2.add(res.get(i));
    }
    return res2;
    }

    }
    1
    2
    3
    解答成功:
    执行耗时:3 ms,击败了48.72% 的Java用户
    内存消耗:38.5 MB,击败了73.26% 的Java用户