StackTc 2017-11-30 13:42 采纳率: 90.9%
浏览 819
已采纳

leetcode第二题 add two number 10C求解

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
 class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode root = new ListNode(0);
                ListNode returnNode = root;
        int carry = 0;
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }
        while(l1 != null || l2 != null){
            int q = (l1 != null) ? l1.val : 0;
            int p = (l2 != null) ? l2.val : 0;
            int sum = (p + q) + carry;
            carry = (p + q) / 10;
            returnNode = new ListNode(sum % 10);
            returnNode = returnNode.next;
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }
        if(carry > 0){
            returnNode.next = new ListNode(carry);
        }
        return returnNode;
    }
}

本人有2个疑点。
1:为什么我的程序不行
2:进位哪里我有点看不懂,比如 【2,4,3】 【2,8,2】 以程序来看结果本人的理解 是【4,2,5,1】 可是期望的结果是【2,2,6】。求算法大神指导。

  • 写回答

3条回答 默认 最新

  • qq_41242687 2017-12-01 17:33
    关注

    这里面链表是从个位开始的,到尽头是最高位,所以
    342+182=524 可以表示为链表加法 2->4->3->null + 2->8->1->null = 4->2->5->null
    你的程序有几个问题(如果不是笔误):
    1. carry 应该是 sum/10,或者说 (p+q+carry)/10,你写 (p+q)/10 是不够的。
    2. 注意 returnNode 要挪到 next 上。
    3. returnNode 一直在沿着链表往后挪,你不能返回 returnNode 了,你得返回 root(的 next)才是表头。
    4. 注意 next 的初始化。

    程序如下,亲测有效:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode root = new ListNode(0);
    ListNode returnNode = root;
    returnNode.next = null;
    int carry = 0;
    if(l1 == null){
    return l2;
    }
    if(l2 == null){
    return l1;
    }
    while(l1 != null || l2 != null){
    int q = (l1 != null) ? l1.val : 0;
    int p = (l2 != null) ? l2.val : 0;
    int sum = (p + q) + carry;
    carry = sum / 10;
    returnNode.next = new ListNode(sum % 10);
    returnNode = returnNode.next;
    returnNode.next = null;
    if(l1 != null) l1 = l1.next;
    if(l2 != null) l2 = l2.next;
    }
    if(carry > 0){
    returnNode.next = new ListNode(carry);
    returnNode = returnNode.next;
    returnNode.next = null;
    }
    return root.next;
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler