1.这是原题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
分析题目:
1.提议:就是让你求两个链表对应位,数字相加的结果。(注意:数字相加要考虑进位)
2 思路:1)链表是按逆序排列的,可以把两个链表的改正为正序,然后两个数相加之和按逆序的方式插入到新的链表就是对应的结果
2)还有一种的就是,循环取连个链表的第一位相加,把它门的除10的商放到进位,(简单点就是 个、十、百、千......)配个图就明白了:
写段代码模拟一下:
public static void main(String[] args) {
// 创建两个链表数组
LinkedList l1 = new LinkedList();
l1.add(2);
l1.add(6);
l1.add(8);
System.out.println(l1);
LinkedList l2 = new LinkedList();
l2.add(6);
l2.add(5);
l2.add(3);
System.out.println(l2);
// 新建链表数组做结果集
LinkedList l3 = new LinkedList();
// 设置进位标识
int carry = 0;
while (!l1.isEmpty()||!l2.isEmpty()|| carry!=0){//表示有一个数据不null或0时继续循环
// 因为有可能取到null,所以就这么写一下
Object val1 = l1.pollFirst();
int val11 = val1!=null?Integer.valueOf(val1.toString()):0;
System.out.println(val11+" val11");
Object val2 = l2.pollFirst();
int val22 = val2!=null?Integer.valueOf(val2.toString()):0;
System.out.println(val22+" val22");
// 算出对应位相加与进位相加之和
int sum = val11+val22+carry;
// 算出进位
carry = sum/10;
// 把对应位商放入到结果集
l3.addLast(sum%10);
}
System.out.println(l2);
System.out.println(l3);
}
输出结果:时间复杂度(O(n))
[2, 6, 8]
[6, 5, 3]
2 val11
6 val22
6 val11
5 val22
8 val11
3 val22
0 val11
0 val22
[]
[8, 1, 2, 1]