题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的(个十百),并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
答案
写完后我看别人的答案,他们都是自己实现一个ListNode链表,我这里使用的是LinkedList,实现算法的原理和思想都差不多,我感觉我的还要比好多人的要好些,嘿嘿嘿,废话不多说,直奔算法核心思想。
首先将public static List<Integer> method1(List<Integer> l1, List<Integer> l2)参数 L1 和 L2 长度中较大的赋给maxList较小的赋给minList,这样做的目的是为了减小代码的冗余度,你应该懂。
要注意的一个点是,使用条件运算符表达式?表达式 :表达式赋值的时候,不能l1.size() >= l2.size() ? (maxList = l1) : (maxList = l2),而是写成下面这样:
maxList = l1.size() >= l2.size() ? l1 : l2;
minList = l1.size() < l2.size() ? l1 : l2;
ListIterator<Integer> maxIterator = maxList.listIterator();
ListIterator<Integer> minIterator = minList.listIterator();
然后再依次求出两对应低位以及前一位进位三者的和sum,再将和sum与10的余数放进结果链表,然后再去求出sum与10的商,作为下一位的进位。
int sum = queotient + maxIterator.next() + minIterator.next();
remainder = sum % 10;
resultList.add(remainder);
queotient = sum / 10;
这里要注意的一个点是,注意求和、取余、取商的次序,取余取商一定要在求和之后。
最后可能会遗留一个进位,别忘记将其加进resultList中!
if(queotient == 1)
resultList.add(queotient);
下面是实现的代码:
package leetCode;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class AddTwoNumbers {
public static void main(String[] args) {
List<Integer> l1 = new LinkedList<>();
List<Integer> l2 = new LinkedList<>();
l1.add(2);
l1.add(4);
l1.add(3);
l2.add(5);
l2.add(6);
l2.add(4);
ListIterator<Integer> resultIterator = method1(l1, l2).listIterator();
while(resultIterator.hasNext()) {
System.out.print(resultIterator.next());
}
}
public static List<Integer> method1(List<Integer> l1, List<Integer> l2){
if(l1.isEmpty() && l2.isEmpty())
return null;
List<Integer> resultList = new LinkedList<>();
List<Integer> maxList = new LinkedList<>();
List<Integer> minList = new LinkedList<>();
maxList = l1.size() >= l2.size() ? l1 : l2;
minList = l1.size() < l2.size() ? l1 : l2;
ListIterator<Integer> maxIterator = maxList.listIterator();
ListIterator<Integer> minIterator = minList.listIterator();
int queotient = 0; //商
int remainder = 0; //余数
while(minIterator.hasNext()) {
int sum = queotient + maxIterator.next() + minIterator.next();
remainder = sum % 10;
resultList.add(remainder);
queotient = sum / 10;
}
while(maxIterator.hasNext()) {
int sum =queotient + maxIterator.next();
remainder = sum % 10;
resultList.add(remainder);
queotient = sum / 10;
}
if(queotient == 1)
resultList.add(queotient);
return resultList;
}
}
1890

被折叠的 条评论
为什么被折叠?



