AddTwoNum

这次和BinaryAdd其实是一道题,这种题目也比较关键。就是对于复杂的条件仔细分析,出了一点问题就过不了了。

  1. 先从一般的情况开始,假设两个linklist都非空,那么就是加上两个值及进位,典型的尾插法,注意处理第一次head,我习惯用个bool值区分。注意tail最好尾部
    next赋NULL避免后面再处理了。

  2. 循环结束三类条件:2.1 两个都空,这时要注意是否有进位产生新的一位,如果有的话(forward==1),那么多插一个点,否则不做。
    2.2 其中一个空,另一个相似处理。假设p1空,那么又分两种,2.2.1 如果不需要再往前进位了,直接结束,否则,2.2.2 要一直往前进位指导不再进位或者p空为止(此时要尾部多加一个1),这里面的while循环
    我好几次都写挂了,一定是p2->val+=forward之后 判断是否>=10,所以最好的写法是集成到while的条件里,同时不要忘记p2判NULL

3 回到输入,判断两个linklist都空或者至少一个空,由于一个空的tail实在不好统一处理,因此 单独处理,其实这样也很方便

短短百行代码,里面的情况是非常多的,一定要特别仔细:
翻过的错误如下:

  1. 居然还会bool 判断语句写成first=true,导致一个奇怪的输出结果分析不出来
  2. 判断单链进位是否结束的时候 ,没有分析清楚,一定是进位之后判断是否>=10,同时要把进位操作做完,集成到while条件就不需要这步了。
    其实有个简介的操作就是p1 p2交换指针,减少代码行数。

    ListNode addTwoNumbers(ListNode l1, ListNode *l2) {

         if(l1==NULL && l2) return l2;
         if(l1 && l2==NULL) return l1;
    
         ListNode* p1=l1,*p2=l2, *lastp1,*lastp2,*tail,*head=NULL,*remainhead;
         int forward=0;
         bool first=true;
         while(p1 && p2)
         {
             int sum=p1->val+p2->val+forward;
             if(sum>=10)
                 forward=1, sum-=10;
             else
                 forward=0;
    
             if(first==true)
             {
                 head=new ListNode(sum);
                 head->next=NULL;
                 tail=head;
                 first=false;
             }
             else
             {
                 ListNode* newnode=new ListNode(sum);
                 newnode->next=NULL;
                 tail->next=newnode;
                 tail=tail->next;
             }
             p1=p1->next;p2=p2->next;
         }
         if(p1==NULL && p2)
         {
             //p2->val+=forward;
             remainhead=p2;
    
            //if(p2->val+forward>=10)
            //{

                while(p2!=NULL && (p2->val+=forward)>=10)
                {
                    //p2->val+=forward;
                    p2->val-=10;
                    forward=1;
                    lastp2=p2;
                    p2=p2->next;
                }
                if(p2==NULL)//final forard 1
                    lastp2->next=new ListNode(1),lastp2->next->next=NULL;
            //}      
            //else
            //    p2->val+=forward;
            tail->next=remainhead;
        }
        else if(p1 && p2==NULL)
        {
            //p1->val+=forward;
            //if(p1->val>=10)
                //p1->val-=10,forward=1;
            remainhead=p1;


            while(p1!=NULL && (p1->val+=forward)>=10)
            {
                //p1->val+=forward;
                p1->val-=10;
                forward=1;
                lastp1=p1;
                p1=p1->next;
            }
            //if(p1!=NULL)
            //    p1->val+=forward;
            if(p1==NULL)//final forard 1
                lastp1->next=new ListNode(1),lastp1->next->next=NULL;
            //}
            //else
            //    p1->val+=forward;
            tail->next=remainhead;
        }
        else
        {
            if(forward==1)
                tail->next=new ListNode(1),tail->next->next=NULL;
        }
        return head;
    }

做了swap之后的代码:

ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
    if(l1==NULL && l2) return l2;
    if(l1 && l2==NULL) return l1;

    ListNode* p1=l1,*p2=l2, *lastp1,*lastp2,*tail,*head=NULL,*remainhead;
    int forward=0;
    bool first=true;
    while(p1 && p2)
    {
        int sum=p1->val+p2->val+forward;
        if(sum>=10)
            forward=1, sum-=10;
        else
            forward=0;

        if(first==true)
        {
            head=new ListNode(sum);
            head->next=NULL;
            tail=head;
            first=false;
        }
        else
        {
            ListNode* newnode=new ListNode(sum);
            newnode->next=NULL;
            tail->next=newnode;
            tail=tail->next;
        }
        p1=p1->next;p2=p2->next;
    }
    if(p1==NULL && p2==NULL)
    {
        if(forward==1)
            tail->next=new ListNode(1),tail->next->next=NULL;
    }
    else
    {
        if(p1 && p2==NULL)
            swap(p1,p2);
        //p2->val+=forward;
        remainhead=p2;


        //if(p2->val+forward>=10)
        //{

            while(p2!=NULL && (p2->val+=forward)>=10)
            {
                //p2->val+=forward;
                p2->val-=10;
                forward=1;
                lastp2=p2;
                p2=p2->next;
            }
            if(p2==NULL)//final forard 1
                lastp2->next=new ListNode(1),lastp2->next->next=NULL;
        //}      
        //else
        //    p2->val+=forward;
        tail->next=remainhead;
    }
    return head;
}

Posted by richard爱闹 - 7月 31 2014
如需转载,请注明: 本文来自 Richard