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);
}
感言
- 写题前应该好好看看大佬的评论
例如
友情提醒一下测试用例的数字是很长的链,实现的时候要考虑上。
- 参考一下他人的题解