• leetCode #2 简单题(链表)


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

    题解:就指向两个链表的头的指针依次向后遍历、算和的余数,记录一下进位。如果L1先遍历到末尾的话,就把L1最后一个指针指向L2当前的next,即把L2剩余的部分接在L1的结尾。这样可以节省不少开辟新Node的空间,然后继续用进位和L1当前Node的值求和,记录进位。如果此时到了L1的末尾还有进位,就new一个新的Node加个结尾就行了。为了快点写完,代码有点丑,将就看吧,以后如果不懒的话再优化一下。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            int toNextNum = 0;
            ListNode* beginNode = l1;
            ListNode* lastNode = l1;
            while(l1 && l2){
                if (l1->val + l2->val + toNextNum >= 10){
                    l1->val = l2->val = (l1->val + l2->val + toNextNum) % 10;
                    toNextNum = 1;
                }else{
                    l1->val = l2->val = (l1->val + l2->val + toNextNum);
                    toNextNum = 0;
                }
                lastNode = l1;
                l1 = l1->next;
                l2 = l2->next;
            }
            if (!l1){
                if (!l2){
                    if (toNextNum > 0)
                        lastNode->next = new ListNode(1);
                }else{
                    lastNode->next = l2;
                    l1 = lastNode = lastNode->next;
                    while(toNextNum > 0){
                        if (l1){
                            if (l1->val + toNextNum >= 10){
                                l1->val = (l1->val + toNextNum) % 10;
                                toNextNum = 1;
                                lastNode = l1;
                                l1 = l1->next;
                            }else{
                                l1->val = (l1->val + toNextNum);
                                toNextNum = 0;
                            }
                        }else{
                            lastNode->next = new ListNode(1);
                            toNextNum = 0;
                        }
                    }
                }
            }else{
                lastNode = l1;
                while(toNextNum > 0){
                    if (l1){
                        if (l1->val + toNextNum >= 10){
                            l1->val = (l1->val + toNextNum) % 10;
                            toNextNum = 1;
                            lastNode = l1;
                            l1 = l1->next;
                        }else{
                            l1->val = (l1->val + toNextNum);
                            toNextNum = 0;
                        }
                    }else{
                        lastNode->next = new ListNode(1);
                        toNextNum = 0;
                    }
                }
            }
            return beginNode;
        }
    };
  • 相关阅读:
    java web乱码及解决方法
    同时启动多个tomcat,端口修改
    oracle RAC LOG_ARCHIVE_DEST_1 与 LOG_ARCHIVE_DEST 冲突解决
    Oracle RAC 集群启动与停止
    Oracle 存储过程批量插入数据
    本地NTP服务器与客户端配置
    oracle 正确删除归档日志,并清除 V$ARCHIVED_LOG 数据
    oracle 断电启动失败:ORA-00600: internal error code, arguments
    maven 打包并导出 lib 第三方jar
    利用MAVEN打包可运行jar包,包括依赖的第三方包
  • 原文地址:https://www.cnblogs.com/error408/p/11546382.html
Copyright © 2020-2023  润新知