Leetcode 2.两数相加 两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的。

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

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

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

题目来源:力扣(LeetCode)
题目链接:https://leetcode.cn/problems/add-two-numbers

 

提示:

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

我们来分析一下题目:
给你了两个链表,按相反顺序把他们转换为整数,然后相加,再反向输出为链表。

先注意一点,因为根据提示第二条,节点的值可能很大,因此需要用到BigInteger这个类,代码如下:

import java.math.BigInteger;

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //用于依次添加节点
        StringBuilder s1 = new StringBuilder();  
        StringBuilder s2 = new StringBuilder();
        //得到两数相加后的值
        BigInteger b1 = new BigInteger("" + replace(s1, l1)).add(new BigInteger("" + replace(s2, l2)));
        //把b1 转为字符串操作
        String s = "" + b1;
        //新建链表
        ListNode head = new ListNode((int)s.charAt(s.length()-1)-'0');
        ListNode l = null;
        //依次添加字符串数据
        for (int i = 0; i < (s.length()-1); i++) {
            l = new ListNode((int)s.charAt(s.length() - (i + 2))-'0');
            add(head,l);
        }
        //返回头节点
        return head;
    }

    //循环向StringBuilder里面添加内容
    public StringBuilder replace(StringBuilder s, ListNode l) {
        boolean flag = true;
        while (flag) {
            if (l != null) {
                s.append(l.val);
                l = l.next;
            } else {
                flag = false;
            }
        }
        //反转顺序
        return s.reverse();
    }

    
    public void add(ListNode head, ListNode l) {
        while (head.next != null) {
            head = head.next;
        }
        head.next = l;
    }
}

执行用时:8 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:41.6 MB, 在所有 Java 提交中击败了32.66%的用户

通过测试用例:1568 / 1568

可以看到执行速度很快,但是内存占用较多。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清风亦思雨

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

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

打赏作者

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

抵扣说明:

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

余额充值