-
题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
-
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
-
代码
/**
* @author 橙橙橙。
* Date:2019年4月1日
* 描述:求两个链表中的数为相反数即从低位到高位的相加,返回一个和的链表
* * 思路:
* 1、新建一个链表,定义一个进位数,定义一个当前链表;
* 2、遍历已知的两个链表的值
* 3、将l1与l2所对应的值以及进位数进行求和;
* 4、再将和值与10相除,作为进位数的值;
* 5、同时给新建的链表增加一个节点,值为与10取余的值;
* 6、连接链表,使得当前指针指向下一个链表节点;
* 7、当完成所有值得加法之后,检查进位数是否有值,如果有,则加到当前链表的后面;
* 8、测试;
*/
public class TwoLinked {
int value;
TwoLinked next;
public TwoLinked(int value) {
this.value = value;
}
public static void main(String[] args) {
TwoLinked l1 = new TwoLinked(2);
TwoLinked l2 = new TwoLinked(4);
TwoLinked l3 = new TwoLinked(3);
l1.next = l2;
l2.next = l3;
TwoLinked l4 = new TwoLinked(5);
TwoLinked l5 = new TwoLinked(6);
TwoLinked l6 = new TwoLinked(4);
l4.next = l5;
l5.next = l6;
TwoLinked l7 = addTwoNumbers(l1, l4);
System.out.println(l7);
while(l7!= null) {
System.out.println("e");
System.out.print(l7.value);
l7 = l7.next;
}
}
/**
* @param l1
* @param l2
* @return
*/
public static TwoLinked addTwoNumbers(TwoLinked l1, TwoLinked l2) {
TwoLinked l3 = new TwoLinked(0); //新建一个返回值链表
TwoLinked curPoint = l3;
TwoLinked p1 = l1; //新建一个指针p1;
TwoLinked p2 = l2; //新建一个指针p2;
int sum = 0; //求和的变量;
int carry = 0; //定义一个进位的值
while(p1 != null || p2 != null) {
int p1value = p1 != null ? p1.value : 0;
int p2value = p2 != null ? p2.value : 0;
sum = p1value + p2value + carry;
carry = sum/10; //取出进位数
//将curPoint.next 设置为当前结点的下一个结点,然后将当前结点前进到下一个结点。
curPoint.next = new TwoLinked(sum%10); //新建一个当前节点的下一个节点;
curPoint = curPoint.next; //将当前指针指向下一个指针
if(p1 != null) p1 = p1.next; //判断p1不为null时,继续指向下一个节点
if(p2 != null) p2 = p2.next; //判断p2不为null时,继续指向下一个节点
}
if(carry > 0) //检查进位是否还有值
curPoint.next = new TwoLinked(carry); //如果有,将这个值放入curPoint中
return l3.next;
}
}