给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
第一眼看到题目的想法是,写一个listNode与int的转化方法,转成int后计算结果,然后再int转成listNode。
于是几分钟写下如下代码:
//链表转int
public static int toInt(ListNode l){
int i = 1;
int val = l.val;
int res = i*val;
while(l.next!=null){
l = l.next;
val = l.val;
i=i*10;
res += i*val;
}
return res;
}
//int转链表
public static ListNode toListNode(int l){
int m = l%10;
int n = l/10;
ListNode res = new ListNode(m);
ListNode head = res;
while(n>0){
m = n%10;
n = n/10;
ListNode node = new ListNode(m);
res.next = node;
res = node;
}
return head;
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int v1 = toInt(l1);
int v2 = toInt(l2);
int sum = v1 + v2;
return toListNode(sum);
}
结果测试集无法通过!
原因是链表转int时如果超过int最大值,这个方法就无效了,而测试用例中恰好有一个[9],[1,9,9,9,9,9,9,9,9,9]…
看来出题人本来就不打算让我们“投机取巧”作整数运算,看来还是小看了这道题。
最终题解:
同时遍历2个链表,每次遍历时相加后取十位数值n用于下次节点相加计算,同时创建新节点;注意三种情况:俩个节点都不为空、l1为空、l2为空,以及临界值n不为0的情况
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int m = 0; int n = 0;
ListNode tmp = new ListNode(-1);
ListNode head = tmp;
while(l1!=null && l2!=null){
int v1 = l1.val;
int v2 = l2.val;
int res = v1 + v2 + n;
m = res%10;
n = res/10;
ListNode p = new ListNode(m);
tmp.next = p;
tmp = p;
l1 = l1.next;
l2 = l2.next;
}
while(l1!=null){
int res = l1.val + n;
m = res%10;
n = res/10;
ListNode p = new ListNode(m);
tmp.next = p;
tmp = p;
l1 = l1.next;
}
while(l2!=null){
int res = l2.val + n;
m = res%10;
n = res/10;
ListNode p = new ListNode(m);
tmp.next = p;
tmp = p;
l2 = l2.next;
}
if(n!=0){
ListNode p = new ListNode(1);
tmp.next = p;
}
return head.next;
}