给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
public class ListNode<E> {
//数据
public int val;
//指向下个节点的引用
public ListNode next;
/**
* 无参构造为了创建头节点服务
*/
public ListNode() {
}
/**
* 构造方法 在构造时就能够给val赋值
*/
public ListNode(int val) {
this.val = val;
}
}
public class AdditionOfTwoNumbers2 {
public static void main(String[] args) {
// 创建两个链表
// 第一个链表: 3-> 7-> 7 -> 2 (在做加法运算代表的是6781)
ListNode l1 = new ListNode(3); // 这是第一个链表的第一个节点(不能用这个节点去往下加数据)
// 必须有一个指针去往第一个节点上去加数据
// 这个指针节点会从链表的第一个节点一直往下走(直至最后一个节点)
ListNode p = l1;
p.next = new ListNode(7);
p = p.next;
p.next = new ListNode(7);
p = p.next;
p.next = new ListNode(2);
// 第二个链表
ListNode l2 = new ListNode(8);
ListNode q = l2;
q.next = new ListNode(9);
q = q.next;
q.next = new ListNode(8);
q = q.next;
q.next = new ListNode(9);
ListNode re = addTwoNumbers(l1, l2);
while (re != null) {
System.out.println(re.val);
re = re.next;
}
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyhead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyhead;
//进位
int carry = 0;
//循环遍历链表直到最后一位
while (p != null || q != null) {
//如果不等于空 val赋值p否则赋值为0
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = x + y + carry;
//进位携带
carry = sum / 10;
//对10取余 找到链表下个节点的数字
curr.next = new ListNode(sum % 10);
//对新链表加节点的引用
curr = curr.next;
if (p != null) {
p = p.next;
}
if (q != null) {
q = q.next;
}
}
//加到最后一位
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyhead.next;
}
}
输出结果是:
1
7
6
2
1