给定两个非空链表来代表两个非负整数,位数按照逆序方式存储,它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode temp1 = l1;
ListNode temp2 = l2;
long num1 = 0;
long num2 = 0;
int i1 = 0;
int i2 = 0;
while (temp1 != null) {
num1 += temp1.val * Math.pow(10, i1);
temp1 = temp1.next;
i1++;
}
while (temp2 != null) {
num2 += temp2.val * Math.pow(10, i2);
temp2 = temp2.next;
i2++;
}
long res = num1 + num2;
// System.out.println(res);
ListNode resListNode = new ListNode((int) (res%10));
ListNode tempNode = resListNode;
while (res >= 10) {
res /= 10;
tempNode.next = new ListNode((int) (res % 10));
tempNode = tempNode.next;
}
return resListNode;
}
}
这样写只能通过1560/1562个测试用例,因为long:64位整数 -9,223,372,036,854,775,808——-9,223,372,036,854,775,807
其中有一个测试用例是这样的:
输出:
[-2]
所以不能用把两个链表加数读取出来,相加之后再倒序组成链表的思想。
应该让链表对应结点相加,检查进位。
---------------------------------------
正确代码
A2两数相加.java
package LeetCode;
public class A2两数相加 {
/**
* Definition for singly-linked list. public class ListNode { int val;
* ListNode next; ListNode(int x) { val = x; } }
*/
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int carry = 0; // 记录进位
ListNode resListNode = new ListNode((l1.val + l2.val + carry) % 10); // 计算个位
carry = (l1.val + l2.val + carry) / 10; // 计算进位
l1 = l1.next; //指针往后移
l2 = l2.next;
ListNode temp = resListNode;
while ((l1 != null) || (l2 != null) || (carry != 0)) { //两个加数当前指针和进位中只要有一个不为0,就继续计算
temp.next = new ListNode((((l1 != null) ? l1.val : 0) + ((l2 != null) ? l2.val : 0) + carry) % 10);
temp = temp.next;
carry = (((l1 != null) ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry) / 10;
l1 = ((l1 != null) ? (l1.next) : l1); //如果当前节点已经为空,那么指针不再后移
l2 = ((l2 != null) ? (l2.next) : l2);
}
return resListNode;
}
public static void main(String[] args) throws NullPointerException {
//测试用例:2->3->4 5->6->4
ListNode l1 = new ListNode(2);
l1.next = new ListNode(4);
l1.next.next = new ListNode(3);
ListNode l2 = new ListNode(5);
l2.next = new ListNode(6);
l2.next.next = new ListNode(4);
// ListNode l1 = new ListNode(9);
// ListNode l2 = new ListNode(1);
// l2.next = new ListNode(9);
// l2.next.next = new ListNode(9);
// l2.next.next.next = new ListNode(9);
// l2.next.next.next.next = new ListNode(9);
// l2.next.next.next.next.next = new ListNode(9);
// l2.next.next.next.next.next.next = new ListNode(9);
// l2.next.next.next.next.next.next.next = new ListNode(9);
// l2.next.next.next.next.next.next.next.next = new ListNode(9);
// l2.next.next.next.next.next.next.next.next.next = new ListNode(9);
A2两数相加 a2两数相加 = new A2两数相加();
ListNode resListNode = a2两数相加.addTwoNumbers(l1, l2);
//这里就打印了前三位
System.out.println(resListNode.val + "->" + resListNode.next.val + "->" + resListNode.next.next.val);
}
}
* 特别要注意的是在条件运算符那里一定要把整个表达式扩起来(如下所示),不然答案会出错。
temp.next = new ListNode((((l1 != null) ? l1.val : 0) + ((l2 != null) ? l2.val : 0) + carry) % 10);
carry = (((l1 != null) ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry) / 10;
A2两数相加ListNode.java
package LeetCode;
public class A2两数相加ListNode {
int val;
A2两数相加ListNode next;
A2两数相加ListNode(int x) {
val = x;
}
}