【问题标题】:Adding two numbers represented as linked list添加表示为链表的两个数字
【发布时间】:2015-05-30 09:39:29
【问题描述】:

我正在尝试实现一个函数来添加两个表示为反向链接列表的数字。在我看来,代码是正确的,但是在两个只包含一个数字 [5] 的链表中给出输入。输出结果是 [0],但它应该是 [0]->[1]

示例 第一个列表: 5->6->3 // 代表数字 365 第二个列表: 8->4->2 // 代表数字 248 。结果列表:3->1->6 //代表数字 613

谁能告诉我我在逻辑上做错了什么?`

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //find length
        int carry = 0;
        ListNode sum = null;
        int x = 0;
        ListNode top = new ListNode(0);
        while(l1 != null || l2 != null){
            sum = new ListNode((l1.val+l2.val+carry)%10);
//            sum.val = (l1+l2+carry)%10;
            if(x==0){
                top.next = sum;
                x++;
            }
            carry = (l1.val+l2.val)/10;
            l1 = l1.next;
            l2 = l2.next;
            sum = sum.next;
        }
        if(l1 == null && l2 == null){
            //return top;

        }else if(l1 != null && l2 == null){
            while(l1 != null){
                sum = new ListNode((l1.val+carry)%10);
//            sum.val = (l1+carry)%10;
            if(x==0){
                top.next = sum;
                x++;
            }
            carry = (l1.val)/10;
            l1 = l1.next;
            sum = sum.next;
            }
            //return top;
        }else{
            while(l1 != null){
            sum = new ListNode((l2.val+carry)%10);
//            sum.val = (l2+carry)%10;
            if(x==0){
                top.next = sum;
                x++;
            }
            carry = (l2.val)/10;
            l2 = l2.next;
            sum = sum.next;
            }
            //return top;
        }
        if(carry == 1){
            sum = new ListNode(1);

            sum = sum.next;
        }
        return top.next;
    }
}`

【问题讨论】:

  • 我觉得你的解释有点混乱......
  • First List: 5->6->3 // 代表数字 365 Second List: 8->4->2 // 代表数字 248 .结果列表:3->1->6 //代表数字 613
  • 好的,在此基础上编辑你的问题,让想要帮助你理解你的问题的人更容易理解
  • 请发布您的完整代码以及插入和主要方法,以便轻松找到错误
  • 没有完整的代码。我在这里解决这个问题 --> leetcode.com/problems/add-two-numbers

标签: java


【解决方案1】:

这是一个解决方案(对ListNode 使用“值”方法):

package so30544570;

public class Solution {
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return ListNode.valueOf(l1.value() + l2.value());
    }

    public static void main(String[] args) {
        ListNode l1 = ListNode.valueOf(365);
        ListNode l2 = ListNode.valueOf(248);
        System.out.println("l1 = " + l1);
        System.out.println("l2 = " + l2);
        System.out.println("l1 + l2 = " + addTwoNumbers(l1, l2));
    }
}

还有ListNode:

package so30544570;

public class ListNode {
    private int val;
    private ListNode next;

    private ListNode(int x) {
        val = x;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder().append(val);
        if (next != null) {
            sb.append(" -> ").append(next.toString());
        }
        return sb.toString();
    }

    public int value() {
        int result = val;
        if (next != null) {
            result += 10 * next.value();
        }
        return result;
    }

    public static ListNode valueOf(final int i) {
        ListNode root = new ListNode(i % 10);
        if (i / 10 > 0) {
            root.next = ListNode.valueOf(i / 10);
        }
        return root;
    }
}

输出:

l1 = 5 -> 6 -> 3

l2 = 8 -> 4 -> 2

l1 + l2 = 3 -> 1 -> 6


注意:这个解决方案避免求和计算,我们只是为求和重新创建一个ListNode

【讨论】:

  • 感谢您的帮助,但问题要在 OJ 上解决,并且无法修改 ListNode 定义。我已经解决了,并找出了错误。再次感谢
【解决方案2】:

你永远不会更新顶部。你应该做的是

if(carry == 1){
            sum = new ListNode(1);
            if(x==0){
                top.next = sum;   //This line is not executed as x = 1
                x++;
        }

什么是 x,为什么使用它。

注意:正确命名变量以提高可读性。

【讨论】:

  • 我必须返回包含总和的链表顶部。这就是我不更新顶部的原因。
  • 是的,代码无论如何都不应该被执行。 X 只是在上面的 while 循环中用于更新第一个节点。
  • 该代码将添加添加 [1]。如果没有执行,那么你将只得到 [0] (就像你现在得到的那样)。如果它被执行,您将得到 [0]->[1](根据需要)。我建议你重新考虑你的逻辑(以及你想用代码实现什么)
  • if(x==0){top.next = sum; x++;}
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2021-08-20
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多