Add two numbers-list,string

Add Two Numbers

主要考虑两个链表相等位数的和,剩下部分与进位的和,只有进位的时候,三种情况
/*
 提交多次才成功,主要是考虑,两个链表不一样长度
 1.
   12
 7990,有数有进位
 2.
  1
 99,无数有进位
 5
 5,
 */
class Solution {
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        if(NULL == l1 || NULL == l2)
		 return (NULL == l1) ? l2 : l1;

	 ListNode *head = NULL, *cur = NULL, *pre = NULL;
	 int sum = 0, preadd = 0, nextadd = 0;
	 while(NULL != l1 && NULL != l2)
	 {
		 sum = (l1->val + l2->val+ preadd) % 10;
		 nextadd = (l1->val + l2->val+ preadd) / 10;
		 if(NULL == head )
			 head = pre = cur = new ListNode(sum);
		 else
		 {
			 cur = new ListNode(sum);
			 pre->next = cur;
		 }
		 pre = cur;
		 preadd = nextadd;

		 l1 = l1->next;
		 l2 = l2->next;
	 }

	 if( l1)
	 {
		 while(preadd && l1)
		 {
			 sum = (l1->val + preadd) % 10;
			 nextadd = (l1->val + preadd) / 10;

			 cur = new ListNode(sum);
			 pre->next = cur;

			 pre = cur;
			 preadd = nextadd;

			 l1 = l1->next;
		 }
		 if(l1)
			 pre->next = l1;
	 }

	 if( l2 )
	 {
		 while(preadd && l2)
		 {
			 sum = (l2->val + preadd) % 10;
			 nextadd = (l2->val + preadd) / 10;

			 cur = new ListNode(sum);
			 pre->next = cur;

			 pre = cur;
			 preadd = nextadd;

			 l2 = l2->next;
		 }
		 if(l2)
			 pre->next = l2;
	 }
	 
	 if(preadd)
	    pre->next = new ListNode(preadd);
	 return head;
    }
};

参考别人的修改的代码:

class Solution {
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        if(NULL == l1 || NULL == l2)
		 return (NULL == l1) ? l2 : l1;
		 
     ListNode *dummy = new ListNode(-1);//头结点
	 ListNode *pre = dummy;//一个指针
	 int sum = 0,nextadd = 0;//一个进位
	 while(NULL != l1 && NULL != l2)
	 {
		 sum = (l1->val + l2->val+ nextadd) % 10;
		 nextadd = (l1->val + l2->val+ nextadd) / 10; //更新进位
		
		 pre->next = new ListNode(sum);
		 pre = pre->next;//更新指针

		 l1 = l1->next;
		 l2 = l2->next;
	 }

	 if( l1)
	 {
		 while(nextadd && l1)//有进位且有指针
		 {
			 sum = (l1->val + nextadd) % 10;
			 nextadd = (l1->val + nextadd) / 10;

			 pre->next = new ListNode(sum);
			 pre = pre->next;
			 l1 = l1->next;
		 }
		 if(l1)//无进位
			 pre->next = l1;
	 }

	 if( l2 )
	 {
		 while(nextadd && l2)
		 {
			sum = (l2->val + nextadd) % 10;
			 nextadd = (l2->val + nextadd) / 10;

			 pre->next = new ListNode(sum);
			 pre = pre->next;
			 l2 = l2->next;
		 }
		 if(l2)
			 pre->next = l2;
	 }
	 
	 if(nextadd)//只有进位的时候
	    pre->next = new ListNode(nextadd);
	 return dummy->next;
    }
};

Add Binary

class Solution {
public:
    string addBinary(string a, string b) {
        string result = "";
	reverse(a.begin(), a.end());//string表示的二进制“110110”,是从高位都低位,相加时候从低位到高位,所以逆转
	reverse(b.begin(), b.end());
	int carry = 0;
	size_t n = a.size() > b.size() ? a.size() : b.size();//因为是string长度已知,不是list指针长度不知道,靠NULL否来判断,可以直接找到最长的值
	for(int i = 0 ; i < n ; ++i)
	{
	    int ai = i >= a.size() ? 0 : a[i]-'0';//因为可能会越界,所以先做判断再选择
	    int bi = i >= b.size() ? 0 : b[i]-'0';
	    int sum = (ai + bi +carry) % 2;
	    carry = (ai + bi +carry)/2;
	    result.insert(result.begin(), sum+'0');//首先是不知道怎么在string 中添加,原来c++string只能两个string 或者字符串字面值连接
	}
	if(carry == 1)
		result.insert(result.begin(),'1');

	return result;
    }
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值