zoukankan      html  css  js  c++  java
  • 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;

    省去了判断。

  • 相关阅读:
    form查询相关表
    获取datagrid更新初始值、新值
    数据库约束查询
    强名称工具(来着.NET)
    使用IE插件不能打开的解决
    导入导出报错
    List批量任务多线程执行工具类
    在C#中使用NHibernate框架查询数据
    使用bat文件顺序执行多个应用程序
    用C#实现抽象工厂模式
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4478501.html
Copyright © 2011-2022 走看看