zoukankan      html  css  js  c++  java
  • 2

    思路

    这道题我大概看了下, 没什么特别的感觉啊, 首先既然list中的digit是倒序存放的, 也就是从头部开始一次表示个位, 十位, 百位... 这样的话就简单了, 直接按照加过去, 只需要O(n)的时间.

    实现

    具体实现上, 也没什么, 就是不断地对于list进行循环然后直至到底list末尾, 要注意的是list可能不等长, 还有如果在两个list都到达末尾的情况下累加器里面还有值(上一次计算有进位), 那么还需要再添加一个node.

    提交

    这次是一次AC

    代码

    里面有一些我自己写的测试代码.

    /**
     * Definition for singly-linked list.
     */
    public class Solution {
        public class ListNode {
            int val;
            ListNode next;
            ListNode(int x) { val = x; }
        }
    
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode re = null, cur = null;
            int adder = 0;
            while(l1 != null && l2 != null){
                int sum = l1.val + l2.val + adder;
                int digit = sum % 10;
                adder = sum / 10;
                if(re == null){
                    re = new ListNode(digit);
                    cur = re;
                }
                else{
                    cur.next = new ListNode(digit);
                    cur = cur.next;
                }
                l1 = l1.next;
                l2 = l2.next;
            }
    
            ListNode l3 = l1 == null ? l2 : l1;
            while(l3 != null){
                int sum = l3.val + adder;
                int digit = sum % 10;
                adder = sum / 10;
                if(re == null){
                    re = new ListNode(digit);
                    cur = re;
                }
                else{
                    cur.next = new ListNode(digit);
                    cur = cur.next;
                }
                l3 = l3.next;
            }
    
            if(adder != 0){
                cur.next = new ListNode(adder);
            }
    
            return re;
        }
    
        private ListNode getNode(int[] list){
            if(list.length == 0) return null;
            ListNode re = new ListNode(list[0]);
            ListNode cur = re;
            for(int i = 1; i < list.length; ++i){
                cur.next = new ListNode(list[i]);
                cur = cur.next;
            }
            return re;
        }
    
        public static void main(String[] args) {
            Solution solution = new Solution();
            ListNode l1 = solution.getNode(new int[]{2, 4, 3});
            ListNode l2 = solution.getNode(new int[]{5, 6, 0});
            ListNode l3 = solution.addTwoNumbers(l1, l2);
    
            while(l3 !=null){
                System.out.println(l3.val);
                l3 = l3.next;
            }
        }
    }
    

    最佳实现

    这道题基本上没什么优化了, 但是代码上还可以写得更整洁, 第一个while其实也能写到第二个while里面, 这里有一份样例代码 :

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode p = l1, q = l2, curr = dummyHead;
        int carry = 0;
        while (p != null || q != null) {
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;
            int sum = carry + x + y;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (p != null) p = p.next;
            if (q != null) q = q.next;
        }
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }
        return dummyHead.next;
    }
    
  • 相关阅读:
    zabbix基于docker安装
    配置Windows实例NTP服务
    linux 上使用yum 安装openjdk1.8
    【Spring Boot-技巧】API返回值去除为NULL的字段
    【微服务】之七:轻松搞定SpringCloud微服务-API权限控制
    【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul
    【DevOps】团队敏捷开发系列--开山篇
    【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign
    【微服务】之四:轻松搞定SpringCloud微服务-负载均衡Ribbon
    【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心
  • 原文地址:https://www.cnblogs.com/nzhl/p/6192896.html
Copyright © 2011-2022 走看看