zoukankan      html  css  js  c++  java
  • 2. 两数相加(C++)[中等]

    题目描述
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

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

    方法1:
    基本思路:
    这个方法较为简单,也是比较被认可的一个方法,中间有创建新的链表。
    其中比较精彩的地方是两数相加进位的部分,值得学习。

    /**
     * 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) {
           ListNode* node = new ListNode(0);
    	   ListNode* p1 = l1;
           ListNode* p2 = l2;
           ListNode* curr = node;
    	   int carry = 0;
    	   
    	   while(p1!=NULL || p2!=NULL){
    		   int x = (p1!=NULL) ? p1->val:0;
    		   int y = (p2!=NULL) ? p2->val:0;
    		   int sum  = carry + x + y;  //x,y加上当前进位
    		   carry =  sum/10;   //进位
    		   curr->next = new ListNode(sum%10);
    		   curr = curr->next;
    		   if(p1!=NULL) p1 = p1->next;
    		   if(p2!=NULL) p2 = p2->next;
    	   }
    	   if(carry > 0)
    		   curr->next = new ListNode(carry);
    	   
    	   return node->next;
        }
    };
    

    方法:2:
    基本思路:
    [这是我最最开始的想法,虽然较为复杂,但是对于的复杂度还是挺可观的,中间没有创建新的链表]:
    l1,l2 以其一较长的链表为最终返回的链表,进行加法运算,逢10加1,加到最短的链表结束为止,判断较长的链表的下一位是否>=10,和如果>=10,它又是否有下一位,没有的话创建新的节点加上去,再加1。

    /**
     * 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) {
            ListNode* p1;      
            ListNode* p2;
            int i =0,count1 = 0,count2 = 0,max=0;
            p1 = l1;
            p2= l2;
            while(p1!=NULL){
                count1++;
                p1 = p1->next;
            }
            while(p2!=NULL){
                count2++;
                p2 = p2->next;
            }
            p1 =l1;
            p2= l2;
            if(count1 >= count2){
                while(p1 != NULL && p2!= NULL){
                p1->val +=p2->val;
                if((p1->val) >=10){
                    if(p1->next!=NULL){
    					p1->val -=10;
                        p1->next -> val ++;
                    }else {
    					ListNode* newNode = new ListNode(0);					
    					p1->val -=10;
                        newNode->val = 0;
    					p1->next = newNode;
    					p1 = newNode;
                        p1->val++;                      
                        newNode->next = NULL;            
                    }
                }
    			    p1 =p1->next;
    				p2 = p2->next;
    			}
                  if(p1!= NULL)  
                 while(p1->val >=10 && p1!= NULL){
                    if(p1->next!=NULL){
    					p1->val -=10;					
                        p1->next->val++;   
                        p1 = p1->next;
                    }else{
    					ListNode* newNode = new ListNode(0);					
    					p1->val -=10;
                        newNode->val = 0;
    					p1->next = newNode;
    					p1 = newNode;
                        p1->val++;                      
                        newNode->next = NULL;  
    				}
                     
                }
    
    		    return l1;
            }else{
                 while(p1 != NULL && p2!= NULL){
                p2->val +=p1->val;
                if((p2->val) >=10){
                    if(p2->next!=NULL){
                        p2->next -> val ++;
                        p2->val -=10;
                    }else{
                       	ListNode* newNode = new ListNode(0);					
    					p2->val -=10;
                        newNode->val = 0;
    					p2->next = newNode;
    					p2 = newNode;
                        p2->val++;                      
                        newNode->next = NULL;    
                    }
                }
    				p1 =p1->next;
    				p2 = p2->next;
    		}               
                if(p2!= NULL)  
                while(p2->val >=10 && p2!= NULL){
                    if(p2->next!=NULL){
    					p2->val -=10;					
                        p2->next->val++;  
                        p2 = p2->next;
                    }else{
    					ListNode* newNode = new ListNode(0);					
    					p2->val -=10;
    					p2->next = newNode;
    					p2 = newNode;
                        p2->val++;                      
                        newNode->next = NULL;  
    				}                
                }
            return l2; 
            }
        }
    };
    

    很少写博客,如果出入,恳请指教 - -

  • 相关阅读:
    NBUT 1120 Reimu's Teleport (线段树)
    NBUT 1119 Patchouli's Books (STL应用)
    NBUT 1118 Marisa's Affair (排序统计,水)
    NBUT 1117 Kotiya's Incantation(字符输入处理)
    NBUT 1115 Cirno's Trick (水)
    NBUT 1114 Alice's Puppets(排序统计,水)
    188 Best Time to Buy and Sell Stock IV 买卖股票的最佳时机 IV
    187 Repeated DNA Sequences 重复的DNA序列
    179 Largest Number 把数组排成最大的数
    174 Dungeon Game 地下城游戏
  • 原文地址:https://www.cnblogs.com/liuzeyu12a/p/12358982.html
Copyright © 2011-2022 走看看