• OJ练习41——T2 Add Two Numbers


    每个链表表示一个数,从前向后,每个节点是该数的从低到高每一个十进制位的值,将两个链表相加,返回一个新链表。

    【思路】

    每次分别取两链的一个节点相加,有进位则累计到下一位。

    思路简单,实现起来有很多细节要处理。

    【my code】

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            ListNode *p,*q,*r;
            ListNode *re=new ListNode(sizeof(ListNode));
            p=l1;
            q=l2;
            r=re;
            int flag=0;
            while(p&&q){         
                r->val=p->val+q->val+flag;
                if(r->val>=10){
                    r->val%=10;
                    flag=1;
                }
                else flag=0;
                p=p->next;
                q=q->next;
                if(p||q){
                    r->next=new ListNode(sizeof(ListNode));
                    r=r->next;
                }
            }
            while(p){
                r->val=p->val+flag;
                if(r->val>=10){
                    r->val%=10;
                    flag=1;
                }
                else flag=0;
                p=p->next;
                if(p){
                    r->next=new ListNode(sizeof(ListNode));
                    r=r->next;
                }
            }
            while(q){
                r->val=q->val+flag;
                if(r->val>=10){
                    r->val%=10;
                    flag=1;
                }
                else flag=0;
                q=q->next;
                if(q){
                    r->next=new ListNode(sizeof(ListNode));
                    r=r->next;
                }
            }
            if(flag==1){
                r->next=new ListNode(sizeof(ListNode));
                r=r->next;
                r->val=1;
                r->next=NULL;
            }
            else if(flag==0) r->next=NULL;
            return re;
        }

    【评价】

    超长无用代码的示范_(:зゝ∠)_   耗时49ms,较为靠前。

    有下面几点纠结了不少时间:

    1.进位flag初始化0,每次计算要重新赋值,有进位赋值为1,无进位赋值为0,不要忽略无进位的情况,否则会每次都加1.——常见错误

    2.re是否预留一个新节点,如果默认预留,最后又没有进位,则会多出一个节点,让该节点=NULL是不行的,在线运行会赋一个“随机”值,其实没有随机,但会告诉你多出一个节点。

    所以只能每次判断是否需要预留节点。

    3.分配新节点空间的代码太繁琐了,ListNode* tail = new ListNode(0); 这样就可以,因为struct中有默认构造函数。

    来看看别人的解法吧。

    【other code】

    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {  
            int carry = 0;  
            ListNode* tail = new ListNode(0);  
            ListNode* ptr = tail;  
              
            while(l1 != NULL || l2 != NULL){  
                int val1 = 0;  
                if(l1 != NULL){  
                    val1 = l1->val;  
                    l1 = l1->next;  
                }  
                  
                int val2 = 0;  
                if(l2 != NULL){  
                    val2 = l2->val;  
                    l2 = l2->next;  
                }  
                  
                int tmp = val1 + val2 + carry;  
                ptr->next = new ListNode(tmp % 10);  
                carry = tmp / 10;  
                ptr = ptr->next;  
            }  
              
            if(carry == 1){  
                ptr->next = new ListNode(1);  
            }  
            return tail->next;  
        }  

    【评价】

    代码十分简洁,但耗时122ms!排名到了c#的范围!

    可见有时候牺牲点代码长度还是值得的。

    可以改进自己的代码:

    flag=r->val/10;
     r->val%=10;

    省去了判断。

  • 相关阅读:
    Centos安装Memcached和(Nginx)Memcache扩展详细教程
    文章已被删除!
    phonegap安卓手机开发入门
    微信分享链接带图片文字和描述
    CSDN数据库被爆 统计CSDN用户都喜欢哪些密码
    ...
    重新初始化 VS2010
    spark系列之基本概念
    python 数字字典加密非汉字
    MySQL 5.7实现 row_number窗口函数
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4478501.html
Copyright © 2020-2023  润新知