我们先来看一个简单题
?思路: 我们大多数人看到这个题肯定想把字符串转化为数字 然后进行一顿操作(x)
因为字符串所表示的数的大小可能会大于int double longlong类型所能表示范围
正确思路 我们应该进行右侧对齐 然后设置一个变量判断是否有进位 然后返回
3//代码实现
class Solution {
public:
? ? string addBinary(string a, string b) {
? ? ? ? ?string res="";
? ? ? ? int n=a.size()-1;
? ? ? ? int m=b.size()-1;
? ? ? ? int ?pre=0;//是否有向前进位
? ? ? ? int cur=0;
? ? ? ? while(n>=0 || m>=0){
? ? ? ? ? ??
? ? ? ? ? ? int cur =(n>=0?a[n]-'0':0)+(m>=0?b[m]-'0':0)+pre;
? ? ? ? ? ? res+=cur%2==0?'0':'1';
? ? ? ? ? ? pre=cur/2;
? ? ? ? ? ? n--;
? ? ? ? ? ? m--;
? ? ? ? ? ??
? ? ? ? }
? ? ? ? if(pre!=0){
? ? ? ? ? ? res+=pre+'0';
? ? ? ? }
? ? ? ? ? reverse(res.begin(),res.end());
? ? ? ? return res;
? ? }
};?
?
二
如果把这个字符串改成链表应该如何操作呢
?我们还是一样的思路 我们还是从低位开始计算 我们应该 先把链表翻转 然后把计算结果进行再次翻转然后返回就得到了正确答案
思路 1.进行把两个链表进行翻转//??https://leetcode-cn.com/problems/reverse-linked-list/
? ? ? ? ?2.然后进行跟上一道题一样的操作
1.如何翻转链表?
代码实现:
ListNode* reversList(ListNode *head){
if(head==NULL) return NULL;
ListNode*cur=head;
ListNode* pre=NULL;
while(cur!=NULL){
ListNode *pnext=cur->next;
cur->next=pre;
pre=cur;
cur=pnext;
}
return pre;
}
2.然后进行操作
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//右侧对齐
ListNode*r1=reversList(l1);
ListNode*r2=reversList(l2);
ListNode *dummy=new ListNode(0);
ListNode* cur=dummy;
int sum=0;
int carry=0;//记录进位问题
while(r1!=NULL || r2!=NULL)
{
cur->next = new ListNode(0);//新建节点
cur = cur->next;
int n1=0;
if(r1!=NULL){
n1=r1->val;
r1=r1->next;
}
int n2=0;
if(r2!=NULL){
n2=r2->val;
r2=r2->next;
}
sum=n1+n2+carry;
carry=sum/10;
cur->val=sum%10;
}
if(carry)
{
cur->next=new ListNode(1);
}
ListNode *r3=dummy->next;
delete dummy;
dummy = nullptr;
ListNode* l3 = reversList(r3);
return l3;
}
};
这里应用了虚拟头结点需要接下来继续研究
|