ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2. 两数相加

2021-03-28 13:04:49  阅读:113  来源: 互联网

标签:ListNode String int 相加 length new ArrayList


2. 两数相加

题目

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

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

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

示例

示例 1:
在这里插入图片描述

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

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

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

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

题中代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 * class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        	# 代码
        }
  }
 */

我的解答


执行结果:通过
执行用时:26 ms
内存消耗:40.6 MB

第一次用Leetcode,有点蒙。
由于最后几个例子没跑过去,我索性用最后面几个示例来实验了
大概思路:
将俩个链表遍历存到俩个String中,将俩个String对位相加(考虑到进位)存入String result中,并构建链表存值返回

输入
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
[5,6,4]
输出
[6,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
预期结果
[6,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
public static void main(String[] args) {
        // 自构建链表1
        // [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
        ArrayList<ListNode> listNodes1 = new ArrayList<>();
        int[] arr = new int[]{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
        int j = 0;
        listNodes1.add(new ListNode(arr[j++], null));
        for (int i = 1; i < arr.length; i++) {
            listNodes1.add(new ListNode(arr[j++], listNodes1.get(i - 1)));
        }
        // 自构建链表2
        ArrayList<ListNode> listNodes2 = new ArrayList<>();
        int[] arr2 = new int[]{5, 6, 4};
        j = 0;
        listNodes2.add(new ListNode(arr2[j++], null));
        for (int i = 1; i < arr2.length; i++) {
            listNodes2.add(new ListNode(arr2[j++], listNodes2.get(i - 1)));
        }
		// 传入链表
        ListNode listNode = addTwoNumbers(listNodes1.get(listNodes1.size() - 1), listNodes2.get(listNodes2.size() - 1));
        // 输出可视化
        ArrayList<Integer> list = new ArrayList<>();
        ListNode fistNode = listNode;
        while (fistNode != null) {
            list.add(fistNode.val);
            fistNode = fistNode.next;
        }
        System.out.println(list);
    }

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    	// 分别遍历链表元素存入ArrayList中
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();
        ListNode n1 = l1;
        ListNode n2 = l2;
        while (true) {
            if (n1 != null) {
                list1.add(n1.val);
                n1 = n1.next;
            } else if (n2 != null) {
                list2.add(n2.val);
                n2 = n2.next;
            } else {
                break;
            }
        }
        // 导出元素到String中
        String s1 = "";
        String s2 = "";
        for (int integer : list1) {
            s1 += integer + "";
        }
        for (int integer : list2) {
            s2 += integer + "";
        }
        // 反转字符串
        String string1 = new StringBuffer(s1).reverse().toString();
        String string3 = new StringBuffer(s2).reverse().toString();
        // 补位,考虑到位数不同
        String ls = "";
        for (int i = 0; i < string1.length() - string3.length(); i++) {
            ls += "0";
        }
        String string2 = ls + new StringBuffer(s2).reverse().toString();
// 之前写的代码用的long,根本放不下.......
//        long list11 = 0;
//        int string1Lenfht = string1.length();
//        long list22 = 0;
//        int string2Lenfht = string2.length();
//        for (int i = 0; i < string1.length(); i++) {
//            list11 += (long)(Integer.parseInt(string1.charAt(i) + "") * Math.pow(10, --string1Lenfht));
//        }
//        for (int i = 0; i < string2.length(); i++) {
//            list22 += (long)(Integer.parseInt(string2.charAt(i) + "") * Math.pow(10, --string2Lenfht));
//        }
//
//        String s = list11 + list22 + "";
		// 字符串对位相加
        String a = string1;
        String b = string2;
        String str = "";
        int lenA = a.length();
        int lenB = b.length();
        int maxLen = (lenA > lenB) ? lenA : lenB;
        int minLen = (lenA < lenB) ? lenA : lenB;
        String strTmp = "";
        for (int i = maxLen - minLen; i > 0; i--) {
            strTmp += "0";
        }
        //把长度调整到相同
        if (maxLen == lenA) {
            b = strTmp + b;
        } else
            a = strTmp + a;
        int JW = 0;//进位
        for (int i = maxLen - 1; i >= 0; i--) {
            int tempA = Integer.parseInt(String.valueOf(a.charAt(i)));
            int tempB = Integer.parseInt(String.valueOf(b.charAt(i)));
            int temp;
            if (tempA + tempB + JW >= 10 && i != 0) {
                temp = tempA + tempB + JW - 10;
                JW = 1;
            } else {
                temp = tempA + tempB + JW;
                JW = 0;
            }
            // 和
            str = temp + str;
        }
		// 拆分为数组,比较容易存入链表
        int[] arr = new int[str.length()];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(str.charAt(i) + "");
        }
		// 构建链表返回
        ArrayList<ListNode> listNodes = new ArrayList<>();
        listNodes.add(new ListNode(arr[0], null));
        for (int i = 1; i < arr.length; i++) {
            listNodes.add(new ListNode(arr[i], listNodes.get(i - 1)));
        }
        // 返回
        return listNodes.get(listNodes.size() - 1);
    }

感言

  • 写题前应该好好看看大佬的评论

例如
友情提醒一下测试用例的数字是很长的链,实现的时候要考虑上。

  • 参考一下他人的题解

标签:ListNode,String,int,相加,length,new,ArrayList
来源: https://blog.csdn.net/qq_30803523/article/details/115278986

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有