如何添加表示为两个非空链表的两个整数?



问题:你得到两个非空链表,代表两个非负整数。数字以相反的顺序存储,其每个节点都包含一个数字。将两个数字相加,然后 将其作为链表返回。您可以假设这两个数字不包含任何前导零,除了 0 本身 **

例: 工作测试用例如下: - 输入: (2 -> 4 -> 3( + (5 -> 6 -> 4( - 输出: 7 -> 0 -> 8 - 说明:342 + 465 = 807。

我的解决方案不适用于以下测试用例:

  • 输入:
    • [9]
    • [1,9,9,9,9,9,9,9,9,9]
  • 输出: [0,-4,-6,-3,-8,-4,-7,-
  • 4,-1,-2]
  • 预期: [
  • 0,0,0,0,0,0,0,0,0,0,0,1]

单链表的定义:

public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}

这是我的解决方案

import java.lang.Math;
class Solution 
{
public ListNode addTwoNumbers(ListNode l1, ListNode l2) 
{
int count = 0;
int number1=0;
int number2=0;
int temp=0;
while(l1 !=null)
{
temp = l1.val;
number1 += temp*Math.pow(10,count);
count++;
l1= l1.next;
}
count = 0;
while(l2 !=null)
{
temp = l2.val;
number2 += temp*Math.pow(10,count);
count++;
l2= l2.next;
}
int sum = number1 + number2;
ListNode l3 = new ListNode(sum%10);
ListNode l4 = l3;
while(sum!=0)
{
sum=sum/10;
if (sum!=0) 
{
l3.next = new ListNode(sum%10);
l3=l3.next; 
} 
}
return l4;  
}
}

你有整数溢出。[1,9,9,9,9,9,9,9,9,9]应代表数字 9 999 999 991。您正在尝试将列表转换为int(number1(,但int可以容纳的最大数字是 2 147 483 647,因为int是有符号的 2 补码 32 位整数。

在这种情况下,如果Java抛出一个异常来让我们知道为什么它不起作用,那就太好了。没有这样的运气。相反,它只是丢弃超过 32 位的高阶位,给出一些无意义的负值(负值,因为符号位(第一位(恰好是 1(。

因此,您需要做的是直接作为链表执行加法,而无需转换为int并返回。您可以非常轻松地拥有三个链表,每个链表最多包含 11 个元素(如果需要,最多包含一百万个元素(,因此这不会导致溢出。

如果您不知道什么是数字溢出,请查找一下。您的搜索引擎就是您的朋友。

尽管您的逻辑看起来不错,但当您遇到表示为链表的大型测试用例/大量测试用例时,这可能会遇到溢出情况。

我会给你一个建议,不要将链表节点转换为数字。有一种方法可以通过链表的正常迭代来以另一种方式做到这一点。

试着想想你通常会如何添加数字,就像我们在学校教的那样,把它写在纸上。

最新更新