LeetCode题解:2. Add Two Numbers

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">题目翻译如下:</span>

有两个链表,每个链表代表一个反向的数字,链表的每个位置代表数字的一位,求两个数字的和,同样用链表反向表示。

比如:2->4->3代表342,5->6->4代表465,它们的和是807,用链表反向表示是7->0->8


题解:

思考:把数字反向表示的话,问题的解决变得相当简单,两个链表从前往后遍历,相同位置的相加,维护一个进位即可


C++语言解决如下:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *tmp1=l1,*tmp2=l2;
		ListNode* head=new ListNode(0);
		ListNode *tmp=head;
		int jinwei=0;

		//遍历相加
		while(tmp1!=NULL&&tmp2!=NULL){
			int cur=tmp1->val+tmp2->val+jinwei;
			if(cur>=10){
				jinwei=cur/10;
				cur%=10;
			}else{
				jinwei=0;
			}
			tmp->next=new ListNode(cur);
			tmp1=tmp1->next;
			tmp2=tmp2->next;
			tmp=tmp->next;
		}

		//继续遍历l1
		while(tmp1!=NULL){
			int cur=tmp1->val+jinwei;
			if(cur>=10){
				jinwei=cur/10;
				cur%=10;
			}else{
				jinwei=0;
			}
			tmp->next=new ListNode(cur);
			tmp1=tmp1->next;
			tmp=tmp->next;
		}

		//继续遍历l2
		while(tmp2!=NULL){
			int cur=tmp2->val+jinwei;
			if(cur>=10){
				jinwei=cur/10;
				cur%=10;
			}else{
				jinwei=0;
			}
			tmp->next=new ListNode(cur);
			tmp2=tmp2->next;
			tmp=tmp->next;
		}

		if(jinwei!=0){
			tmp->next=new ListNode(jinwei);
		}

		tmp=head->next;
		delete head;

		return tmp;
    }


数字如果是正向表示呢,该怎么办?

比如:3->4->2代表342,4->6->5代表465,它们的和是807,用链表表示是8->0->7


思考:一种解决方式可以是从前往后遍历,把每个位置的数字进行保存,然后再从后往前遍历,计算结果。

         利用栈会方便很多,但是这样用到了高级数据结构,同时空间复杂度变为O(n)。但暂时也没想到更好的方法。

代码如下:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        stack<int> num1,num2;
		for(ListNode* tmp=l1;tmp!=NULL;tmp=tmp->next){
			num1.push(tmp->val);
		}
		for(ListNode* tmp=l2;tmp!=NULL;tmp=tmp->next){
			num2.push(tmp->val);
		}

		int jinwei=0;
		ListNode *head=new ListNode(0),*tmp=head;
		while(!num1.empty()&&!num2.empty()){
			int cur=num1.top()+num2.top()+jinwei;
			num1.pop();num2.pop();
			if(cur>=10){
				jinwei=cur/10;
				cur%=10;
			}else{
				jinwei=0;
			}
			tmp->next=new ListNode(cur);
			tmp=tmp->next;
		}
		
		while(!num1.empty()){
			int cur=num1.top()+jinwei;
			num1.pop();
			if(cur>=10){
				jinwei=cur/10;
				cur%=10;
			}else{
				jinwei=0;
			}
			tmp->next=new ListNode(cur);
			tmp=tmp->next;
		}
		
		while(!num2.empty()){
			int cur=num2.top()+jinwei;
			num2.pop();
			if(cur>=10){
				jinwei=cur/10;
				cur%=10;
			}else{
				jinwei=0;
			}
			tmp->next=new ListNode(cur);
			tmp=tmp->next;
		}

		if(jinwei!=0){
			tmp->next=new ListNode(jinwei);
		}

		tmp=head->next;
		delete head;

		return tmp;
    }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值