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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值