zoukankan      html  css  js  c++  java
  • 2. 两数相加

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    这道题,利用“反过来进位的思维”,还是挺好想的,直接贴代码吧~~

    public class Second {
        
      public static ListNode addTwoNumbers(ListNode l1, ListNode l2){
            //end用来操作最后一个链表
            //给他个默认值0,其实是没必要的,只是我为了方便才加进去的。到最后这个节点“0”是要去除的
            ListNode end = new ListNode(0);
            //ret是最终返回的结果
            ListNode ret = end;
           //用来表示进位部分,如果上一次相加的结果超过10,enter就是1,否则是0
            int enter = 0;
            //当两个链表都有值的时候
            while((l1 != null && l2 != null) ) {
                //加上enter,表示进位
                int sum = l1.val + l2.val + enter;
                int endVal;
                if(sum >= 10){
                    endVal = sum - 10;
                    enter = 1;
                }else{
                    endVal = sum;
                    enter = 0;
                }
                ListNode next = new ListNode(endVal);
                end.next = next;
                end = next;
                l1 = l1.next;
                l2 = l2.next;
            }
            //如果l2链表已经走完了
            while(l1 != null){
                int sum = l1.val + enter;
                int endVal;
                if(sum >= 10){
                    endVal = sum - 10;
                    enter = 1;
                }else{
                    endVal = sum;
                    enter = 0;
                }
                ListNode next = new ListNode(endVal);
                end.next = next;
                end = next;
                l1 = l1.next;
            }
          //如果l1链表已经走完了
            while(l2 != null){
                int sum = l2.val + enter;
                int endVal;
                if(sum >= 10){
                    endVal = sum - 10;
                    enter = 1;
                }else{
                    endVal = sum;
                    enter = 0;
                }
                ListNode next = new ListNode(endVal);
                end.next = next;
                end = next;
                l2 = l2.next;
            }
            //如果是[5],[5]的情况下,他的进位是1,这一步是不会让[5]跟[5]的结果变成[0]
            //如果到最后的进位为1的话,那么还是要再添加一个节点,值为1,链接到最后
            if(enter == 1){
                end.next = new ListNode(1);
            }
            //最后再把一开始那个起始节点除去掉。
            if(ret.next != null){
                ret = ret.next;
                return ret;
            }
            return null;
        }
    
        public static void main(String[] args) {
            ListNode l1 = new ListNode(2);
            ListNode l2 = new ListNode(4);
            ListNode l3 = new ListNode(3);
            ListNode l4 = new ListNode(5);
            ListNode l5 = new ListNode(3);
            l1.next = l2;
            l2.next = l3;
            l3.next = l4;
            l4.next = l5;
            ListNode r1 = new ListNode(5);
            ListNode r2 = new ListNode(6);
            ListNode r3 = new ListNode(4);
            r1.next = r2;
            r2.next = r3;
            ListNode a = addTwoNumbers(l1, r1);
            while(a != null){
                System.out.println(a.val);
                a = a.next;
            }
        }
    }
    
    
    
    
  • 相关阅读:
    Memcached缓存在.Net 中的使用(memcacheddotnet)
    转载 单目摄像机标定说明
    图像的上采样 下采样
    VOC数据集 目标检测
    tensorflow用pretrained-model做retrain
    图像分类基础
    TensorRT学习总结
    Jetson Nano Developer Kit
    pytorch深度学习60分钟闪电战
    系统检测工具ROSWTF
  • 原文地址:https://www.cnblogs.com/disandafeier/p/10878723.html
Copyright © 2011-2022 走看看