题意:
给定一个用单链表表示的整数,然后把这个整数加一。
方法一:
逆向模拟相加
思路:
步骤如下:首先,反转链表;
然后,遍历链表+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; } };
时间复杂度:空间复杂度: