• 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; 
            }
        }
    };
    

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

  • 相关阅读:
    Fiddler——若网模拟测试
    MySQL——concat / instr函数
    Centos7 + docker + Jenkins搭建及测试
    常用正则表达式
    mariadb配置文件优化参数
    Python小技巧整理
    部署zabbix3.2.7,升级到3.4、proxy部署
    zabbix3.4.x添加短信报警
    个人总结OLinux上安装oracle11G Data Guard
    LRM-00109: could not open parameter file '/u01/app/oracle/product/12.1.0/db_1/dbs/initepps.ora'
  • 原文地址:https://www.cnblogs.com/liuzeyu12a/p/12358982.html
Copyright © 2020-2023  润新知