题目描述:
Given a non-negative integer represented as non-empty a singly linked list of digits, plus one to the integer.
You may assume the integer do not contain any leading zero, except the number 0 itself.
The digits are stored such that the most significant digit is at the head of the list.
Example :
Input: [1,2,3]
Output: [1,2,4]
class Solution {
public:
ListNode* plusOne(ListNode* head) {
if(head==NULL) return NULL;
ListNode* rhead=reverse(head);
int carry=1;
ListNode* p=rhead;
ListNode* pre=p;
while(carry&&p)
{
int x=p->val+carry;
p->val=x%10;
carry=x/10;
pre=p;
p=p->next;
}
if(carry) pre->next=new ListNode(1);
return reverse(rhead);
}
ListNode* reverse(ListNode* head)
{
if(head==NULL||head->next==NULL) return head;
ListNode* dummy=new ListNode(0);
dummy->next=head;
ListNode* p=head;
ListNode* pre=dummy;
while(p->next)
{
ListNode* tmp=p->next;
p->next=p->next->next;
tmp->next=dummy->next;
dummy->next=tmp;
}
return dummy->next;
}
};
class Solution {
public:
ListNode* plusOne(ListNode* head) {
ListNode* p=head;
ListNode* right=NULL;
while(p) // 找到最右边不为9的节点标记为right
{
if(p->val!=9) right=p;
p=p->next;
}
if(!right) //所有节点都是9的情况下,增加一个节点放在最左边
{
right=new ListNode(0);
right->next=head;
head=right;
}
right->val++;
p=right->next;
while(p) //right右边的所有数字变成0
{
p->val=0;
p=p->next;
}
return head;
}
};
本文深入探讨了链表加一算法的两种实现方法。一种是通过翻转链表进行加一操作,再翻转回来;另一种是遍历链表找到最右侧不为9的节点并加一,将右侧节点置零。文章提供了详细的代码实现,适合对链表操作和算法优化感兴趣的读者。
759

被折叠的 条评论
为什么被折叠?



