欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2. 两数相加(C++)[中等]

程序员文章站 2022-03-09 10:21:06
...

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

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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; 
        }
    }
};

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

相关标签: 刷题刷题