• 编程练习:两数相加


    题目-LeetCode

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

    示例:

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

    分析

    • 这其实是链表的操作,在之前数据结构中很常见,对两个链表进行操作;
    • 另外这里两数被表示成链表形式,比如2->4->3 个位是2,十位是4,百位是3;其实可以按照算术中的加法,个位与个位相加、、、,所以这样就比较简单了;
    链表长度
    • 两个链表长度相同比较好处理,但是还要注意链表长度不一样带来的问题;详细见代码分析!

    实现(java)

    节点表示
    /**
     * 列表节点定义
     */
    class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x;}
    }
    
    处理函数
    /**
         * 两个数相加
         * @param l1
         * @param l2
         * @return
         */
        public static  ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    
            // 以l1为返回列表
            ListNode moveNode = l1; // 移动节点
            ListNode tempNode = null;
            int outNum = 0;
            // 1. 处理前面两个节点相加部分
            while (l2 != null && moveNode != null) {
                int value = l2.val + moveNode.val + outNum;
                moveNode.val = value % 10;
                outNum = value / 10;
                if (moveNode.next == null){
                    tempNode = moveNode; // 最后一个节点记录下来
                }
                moveNode = moveNode.next;
                l2 = l2.next;
            }
            // 2. 处理列表超长
            if (l2 == null && moveNode != null){
                if (outNum != 0){ // moveNode != null
                    while (moveNode != null) {
                        int value = moveNode.val + outNum;
                        moveNode.val = value % 10;
                        outNum = value / 10;
                        if (moveNode.next == null){
                            break;
                        }
                        moveNode = moveNode.next;
                    }
                }
    
            }else if( moveNode == null && l2 != null){
                tempNode.next = l2;
                tempNode = l2;
                if (outNum != 0){ // l2 != null
                    while (tempNode != null) {
                        int value = tempNode.val + outNum;
                        tempNode.val = value % 10;
                        outNum = value / 10;
                        if (tempNode.next == null){
                            break;
                        }
                        tempNode = tempNode.next;
                    }
                }
    
            }else{
                if (outNum != 0){ // 两个长度一样
                    ListNode node = new ListNode(outNum);
                    tempNode.next = node;
                }
            }
            // 如果上面一直相加超过10,则最后溢出位处理之
            if (outNum != 0) {
                ListNode node = new ListNode(outNum);
                if (moveNode != null){
                    moveNode.next = node;
                }else {
                    tempNode.next = node;
                }
            }
            return  l1;
        }
    

    这段代码中还可以优化,当时在提交到LeetCode不正确后,变只图通过测试,没有考虑到性能!

    主函数调用
    public static void main(String[] args) {
    
            ListNode l1 = new ListNode(9);
            ListNode node1 = new ListNode(8);
            ListNode node2 = new ListNode(3);
            l1.next = node1;
            node1.next = node2;
            ListNode l2 = new ListNode(9);
            ListNode node3 = new ListNode(9);
            ListNode node4 = new ListNode(4);
            l2.next = node3;
            node3.next = node4;
    
            ListNode nodes = addTwoNumbers(l1, l2);
    
            while (nodes != null) {
                if (nodes.next != null){
                    System.out.print(nodes.val + "->");
                }else {
                    System.out.print(nodes.val);
                }
                nodes = nodes.next;
            }
        }
    
    结果
    8->8->8
    

    最后

    此致,敬礼!

  • 相关阅读:
    Visual Studio的多语言加载项 Multi-Language for Visual Studio
    C#(99):文件监视 FileSystemWatcher
    亿图Edraw Project,甘特图
    C#(99):格式化信息、格式化数字、格式化日期
    小程序访问接口由于缺少中间证书访问失败的问题
    微信授权登录“redirect_uri域名与后台配置不一致”,公众号错误码10003
    如何在idea上新建一个springboot项目
    CSS实现网页背景图片自适应全屏的方法
    Umi与Keycloak整合
    Canal帮助MySQL进行数据同步
  • 原文地址:https://www.cnblogs.com/numen-fan/p/10499857.html
Copyright © 2020-2023  润新知