【LeetCode每日一题】——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

七【题目进阶】

  • 如果输入链表不能翻转该如何解决?

八【解题思路】

  • 利用栈的思想
  • 因为要从低位开始相加,所以将两个链表元素值入栈
  • 然后从低位开始相加,记录进位,每次得到一个结果就将链表连接起来
  • 还要注意的是两个链表长度可能不一样,那么短的就认为加0即可
  • 最后返回链表头结点即可

九【时间频度】

  • 时间复杂度: O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n)),其中 m , n m,n m,n 是链表元素长度
  • 空间复杂度: O ( m + n ) O(m+n) O(m+n),其中 m , n m,n m,n 是链表元素长度

十【代码实现】

  1. Java语言版
package Stack;

import java.util.ArrayDeque;
import java.util.Deque;

public class p445_AddingTwoNumbersII {

    int val;
    p445_AddingTwoNumbersII next;

    public p445_AddingTwoNumbersII(int val) {
        this.val = val;
    }

    public p445_AddingTwoNumbersII(int val, p445_AddingTwoNumbersII next) {
        this.val = val;
        this.next = next;
    }

    public static void main(String[] args) {
        p445_AddingTwoNumbersII l11 = new p445_AddingTwoNumbersII(7);
        p445_AddingTwoNumbersII l12 = new p445_AddingTwoNumbersII(2);
        p445_AddingTwoNumbersII l13 = new p445_AddingTwoNumbersII(4);
        p445_AddingTwoNumbersII l14 = new p445_AddingTwoNumbersII(3);
        p445_AddingTwoNumbersII l21 = new p445_AddingTwoNumbersII(5);
        p445_AddingTwoNumbersII l22 = new p445_AddingTwoNumbersII(6);
        p445_AddingTwoNumbersII l23 = new p445_AddingTwoNumbersII(4);
        l11.next = l12;
        l12.next = l13;
        l13.next = l14;
        l21.next = l22;
        l22.next = l23;
        p445_AddingTwoNumbersII res = addTwoNumbers(l11, l21);
        while (res != null) {
            if (res.next != null) {
                System.out.print(res.val + "->");
            } else {
                System.out.print(res.val);
            }
            res = res.next;
        }
    }

    public static p445_AddingTwoNumbersII addTwoNumbers(p445_AddingTwoNumbersII l1, p445_AddingTwoNumbersII l2) {
        Deque<Integer> stack1 = new ArrayDeque<Integer>();
        Deque<Integer> stack2 = new ArrayDeque<Integer>();
        int carry = 0;
        p445_AddingTwoNumbersII head = null;
        while (l1 != null) {
            stack1.push(l1.val);
            l1 = l1.next;
        }
        while (l2 != null) {
            stack2.push(l2.val);
            l2 = l2.next;
        }
        while (!stack1.isEmpty() || !stack2.isEmpty() || carry != 0) {
            int x = stack1.isEmpty() ? 0 : stack1.pop();
            int y = stack2.isEmpty() ? 0 : stack2.pop();
            int sum = x + y + carry;
            carry = sum / 10;
            p445_AddingTwoNumbersII temp = new p445_AddingTwoNumbersII(sum % 10);
            temp.next = head;
            head = temp;
        }
        return head;
    }

}
  1. C语言版
#include<stdio.h>
#include<stdlib.h>

struct ListNode {
	int val;
	struct ListNode *next;
};

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
	int stack1[101] = { 0 };
	int stack2[101] = { 0 };
	int top1 = 0;
	int top2 = 0;
	int carry = 0;
	struct ListNode* temp = NULL;
	struct ListNode* head = NULL;
	while (l1 != NULL)
	{
		stack1[top1++] = l1->val;
		l1 = l1->next;
	}
	while (l2 != NULL)
	{
		stack2[top2++] = l2->val;
		l2 = l2->next;
	}
	while (top1 != 0 || top2 != 0 || carry != 0)
	{
		int x = top1 > 0 ? stack1[--top1] : 0;
		int y = top2 > 0 ? stack2[--top2] : 0;
		int sum = x + y + carry;
		carry = sum / 10;
		head = (struct ListNode*)malloc(sizeof(struct ListNode));
		head->val = sum % 10;
		head->next = temp;
		temp = head;
	}
	return head;
}

/*主函数省略*/

十一【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值