LinkedList最后一个值没有被解析

我在做一道leetcode题。两个数字相加

其中一个testCases没有通过,我不知道为什么我的程序会漏掉最后一个值。下面是代码。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //have to use bit addition here
        if(l1==null){
            return l2;
        }
        if(l2==null){
            return l1;
        }

        int b1=0, b2=0, resBit = 0, carryBit=0;
        ListNode res = new ListNode(-1);
        ListNode dummy = res;

        while(l1!=null && l2!=null){
            resBit = l1.val+l2.val+carryBit;
            if(resBit >9){
                carryBit=1;
                resBit=resBit%10;
            }
            else{
                carryBit=0;
            }
            dummy.next = new ListNode(resBit);
            l1=l1.next;
            l2=l2.next;
            dummy=dummy.next;
        }

        //add any remaining numbers to our result

        if(l1!=null){
            System.out.println(l1.val);
            if(carryBit!=0){
                resBit = l1.val+carryBit;
                if(resBit >9){
                    carryBit=1;
                    resBit=resBit%10;
                }
                else{
                    carryBit=0;
                }
                dummy.next = new ListNode(resBit);
            }
            else{

                dummy.next = new ListNode(l1.val);
            }
            l1=l1.next;
            System.out.println(l1.val);
            dummy=dummy.next;
        }

        if(l2!=null){
            if(carryBit!=0){
                resBit = l2.val+carryBit;
                if(resBit >9){
                    carryBit=1;
                    resBit=resBit%10;
                }
                else{
                    carryBit=0;
                }
                dummy.next = new ListNode(resBit);
            }
            else{
                dummy.next = new ListNode(l2.val);
            }
            l2=l2.next;
            dummy=dummy.next;
        }

        if(carryBit!=0){
            dummy.next = new ListNode(carryBit);
        }


        //remove the -1 used to create the LL initially
        res = res.next;

        return res;
    }
} 

以下是失败的测试案例的细节:

Wrong AnswerRuntime: 0 msYour input[9,1,6][0]

stdout16

产量[9,1]预期[9,1,6]

如你所见,我的代码漏掉了6。然而,在剩余的L1元素解析循环中,6被打印出来了。为什么会漏掉呢?

唯一可能漏掉的方法是循环没有被运行,这意味着程序将6作为空值,因此跳过了一个值。不知道为什么会出现这种情况。这条思路对吗?

任何新的信息,或者改进都非常感谢。

解决方案:

作为一点无耻的促销活动,请查看 我的办法. 但我可以指出为什么它不工作的原因,和一些其他的事情,是良好的做法首先,什么是 b1b2 为?我是不是遗漏了什么,因为我在你的代码中没有看到它。

在这里

if(resBit >9){
    carryBit=1;
    resBit=resBit%10;
}

你把携带位设置为 1. 但是,你必须将它设置为 sum / 10 万一总和达到 20. 在实际问题中,并没有任何测试用例会给你带来问题,然而在数字较大的情况下,这会导致错误。

更大的原因是这部分。

if(l1!=null){

和…

if(l2!=null){

你只是在检查它是否不为空。然而,如果两个列表的大小相差2个或更多,那么 l1l2 终止时仍然是非空的。所以,你必须改变 ifwhile 循环。

当我应用这些变化时,它工作了。这就是结果。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //have to use bit addition here
        if(l1==null){
            return l2;
        }
        if(l2==null){
            return l1;
        }

        int resBit = 0, carryBit=0;
        ListNode res = new ListNode(-1);
        ListNode dummy = res;

        while(l1!=null && l2!=null){
            resBit = l1.val+l2.val+carryBit;
            if(resBit >9){
                carryBit=resBit / 10;
                resBit=resBit%10;
            }
            else{
                carryBit=0;
            }
            dummy.next = new ListNode(resBit);
            l1=l1.next;
            l2=l2.next;
            dummy=dummy.next;
        }

        //add any remaining numbers to our result

        while(l1!=null){
            if(carryBit!=0){
                resBit = l1.val+carryBit;
                if(resBit >9){
                    carryBit=1;
                    resBit=resBit%10;
                }
                else{
                    carryBit=0;
                }
                dummy.next = new ListNode(resBit);
            }
            else{

                dummy.next = new ListNode(l1.val);
            }
            l1=l1.next;
            dummy=dummy.next;
        }

        while(l2!=null){
            if(carryBit!=0){
                resBit = l2.val+carryBit;
                if(resBit >9){
                    carryBit=1;
                    resBit=resBit%10;
                }
                else{
                    carryBit=0;
                }
                dummy.next = new ListNode(resBit);
            }
            else{
                dummy.next = new ListNode(l2.val);
            }
            l2=l2.next;
            dummy=dummy.next;
        }

        if(carryBit!=0){
            dummy.next = new ListNode(carryBit);
        }


        //remove the -1 used to create the LL initially
        res = res.next;

        return res;
    }
}

本文来自投稿,不代表实战宝典立场,如若转载,请注明出处:https://www.shizhanbaodian.com/40707.html

(0)
上一篇 13小时前
下一篇 13小时前

相关推荐

发表评论

登录后才能评论