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