如何添加表示为两个非空链表的两个整数?
Posted
技术标签:
【中文标题】如何添加表示为两个非空链表的两个整数?【英文标题】:How do I add two integers represented as two non-empty linked lists? 【发布时间】:2020-02-09 05:42:43 【问题描述】:问题:给定两个代表两个非负整数的非空链表。这些数字以相反的顺序存储,它们的每个节点都包含一个数字。将两个数字相加 将其作为链表返回。您可以假设这两个数字不包含任何前导零,除了 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,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;
【问题讨论】:
好的,但是你的问题是什么? 你能提供更多细节吗? 这真的不是解决这个问题的正确方法。 给了我两个ListNode(实现如下),像单链表一样,每个都包含相反顺序的数字。我必须通过按实际顺序使用它们来添加两个列表节点中的两个数字。我的代码适用于除一个之外的所有测试用例。输入:[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,1] 【参考方案1】:你有整数溢出。 [1,9,9,9,9,9,9,9,9,9]
应该代表数字 9 999 999 991。您正在尝试将列表转换为 int
(number1
),但 int
可以容纳的最大数字是 2 147 483 647,因为 @987654325 @ 是带符号的 2 补码 32 位整数。
在这种情况下,如果 Java 会抛出一个异常来让我们知道它为什么不起作用,那就太好了。没有这样的运气。相反,它只是简单地丢弃超过 32 位的高位,给出一些无意义的负值(负值,因为符号位(第一位)恰好是 1)。
因此,您需要做的是直接将添加作为链表执行,而无需转换为 int
并返回。您可以非常轻松地拥有三个链表,每个链表最多包含 11 个元素(如果需要,还可以包含多达一百万个元素),因此不会导致溢出。
如果你不知道什么是数字溢出,请查一下。您的搜索引擎就是您的朋友。
【讨论】:
我在 leetcode 上有这个问题。我不知道为什么我的输出为负输出:[0,-4,-6,-3,-8,-4,-7,-4,-1,-2]【参考方案2】:虽然您的逻辑看起来不错,但当您遇到表示为链接列表的大型测试用例/大量数字时,这可能会遇到溢出情况。
我给你一个建议,不要把链表节点转换成数字。有一种方法可以通过链表的正常迭代来实现。
试着想想你通常会如何像我们在学校教的那样把数字写在纸上。
【讨论】:
我认为这是对我的回答的一个很好的补充(或者我的回答是对你的回答的适度补充)。谢谢。 是的。相同的逻辑,但写法不同。以上是关于如何添加表示为两个非空链表的两个整数?的主要内容,如果未能解决你的问题,请参考以下文章
给定两个逆序非空链表,求链表中两数相加的和,且仍返回逆序链表