题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
我起初的想法很简单:
初始化两个链表,然后取出两个链表中的每一个元素相加,然后再定义一个链表用于存储这个求和产生的链表
在实现的过程中遇到了如下的问题:
测试方法中,输出 addTwoNumbers 方法的返回值,输出是hashcode值
没有考虑到数字进位的问题(蠢到爆的问题😂)
函数返回 curr.next 为空
上面的问题都解决了,报错:Operator'' cannot be applied to 'int', 'addTwoNumbers. ListNode
解决上面问题的方法:
1. 测试方法,在输出addTwoNumbers方法返回值的时候,使用 System.out.print(sum.val);
2. 解决进位问题:
carry = numsum / 10;//获取进位的值
curr.next = new ListNode(numsum % 10);//取模运算,把个位数字存到链表sum中
3. 因为头结点是没有前一个结点的,因此我们要浪费一个空间使其总是以null作为头结点。所以返回的不应该是 curr.next 而应该是 sum.next;
4. 解决 int 和 ListNode 不能相加的问题:
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int numsum = carry + x + y;
完整代码:
public class addTwoNumbers {
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode sum = new ListNode(0);
ListNode p = l1, q = l2, curr = sum;
int carry = 0;//进位
while(p != null || q != null) {
//解决 Operator'' cannot be applied to 'int', 'addTwoNumbers. ListNode
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int numsum = carry + x + y;
carry = numsum / 10;//获取进位的值
curr.next = new ListNode(numsum % 10);//取模运算,把个位数字存到链表sum中
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return sum.next;
}
public static void main(String[] args) {
ListNode listNode1 = new ListNode(2);
ListNode listNode2 = new ListNode(4);
ListNode listNode3 = new ListNode(3);
listNode1.next = listNode2;
listNode2.next = listNode3;
ListNode listNode21 = new ListNode(5);
ListNode listNode22 = new ListNode(6);
ListNode listNode23 = new ListNode(4);
listNode21.next = listNode22;
listNode22.next = listNode23;
ListNode sum = addTwoNumbers(listNode1, listNode21);
while (sum != null){
System.out.print(sum.val);
sum = sum.next;
System.out.print("->");
}
}
}
本文分享 CSDN - 进阶的小名。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。