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

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】:

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

我给你一个建议,不要把链表节点转换成数字。有一种方法可以通过链表的正常迭代来实现。

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

【讨论】:

我认为这是对我的回答的一个很好的补充(或者我的回答是对你的回答的适度补充)。谢谢。 是的。相同的逻辑,但写法不同。

以上是关于如何添加表示为两个非空链表的两个整数?的主要内容,如果未能解决你的问题,请参考以下文章

给定两个逆序非空链表,求链表中两数相加的和,且仍返回逆序链表

添加两个数字链表

LeetCode

LeetCode #2 - Add Two Numbers 递归实现

两数相加

两数相加