题意:
给定一个用单链表表示的整数,然后把这个整数加一。
方法一:
逆向模拟相加
思路:
步骤如下:首先,反转链表;
然后,遍历链表+1;
之后,判断最高进位是否要添加新的节点;
最后,再次反转链表。
class Solution {
public:
ListNode* plusOne(ListNode* head) {
if(head==nullptr)
return head;
//反转字符串
head=reverseList(head);
int flag=1;
ListNode *p=head;
while(p){//遍历链表+1
int t=p->val+flag;
p->val=t%10;
if(t>=10){
flag=1;
}else{
flag=0;
break;
}
p=p->next;
}
if(flag){//最后判断进位
p=head;
while(p->next){
p=p->next;
}
ListNode *q=new ListNode(1);
p->next=q;
}
//反转字符串
head=reverseList(head);
return head;
}
ListNode* reverseList(ListNode* head){//反转字符串
ListNode* p=head,*q=head->next,*t;
p->next=nullptr;
while(q){
t=q->next;
q->next=p;//逆转效果
p=q;
q=t;
}
return p;
}
};
时间复杂度:
空间复杂度:![]()
方法二:
字符串存储
思路:首先,用字符串存储链表的值;然后,利用字符串进行+1操作;最后,将字符串的值替换给原链表。注意:根据最后进位判断是否要添加一个新节点。
class Solution {
public:
ListNode* plusOne(ListNode* head) {
if(head==nullptr)
return head;
string s="";//初始化字符串
ListNode *p=head;
while(p){//遍历链表追加字符串
s+=p->val+'0';
p=p->next;
}
int flag=1;
for(int i=s.size()-1;i>=0;i--){
int t=s[i]-'0'+flag;//加法运算
s[i]=t%10+'0';
if(t>=10){
flag=1;
}else{
flag=0;
break;
}
}
p=head;
int i=0;
while(p){//遍历链表替换值
p->val=s[i]-'0';
p=p->next;
i++;
}
if(flag){//最后判断进位
ListNode *q=new ListNode(1);
q->next=head;
head=q;
}
return head;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号