Input:
1->2->3
Output:
1->2->4
1,反轉(zhuǎn)后從左向右加一,當(dāng)最高位出現(xiàn)進(jìn)位的時(shí)候,額外申請(qǐng)一個(gè)節(jié)點(diǎn)保存進(jìn)位,之后在反轉(zhuǎn)鏈表并返回。
2,當(dāng)沒有進(jìn)位的適合不需要繼續(xù)遍歷鏈表
3,在遍歷鏈表做加一的同時(shí),記錄下當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),當(dāng)循環(huán)退出條件是p==NUll適合,同時(shí)又存在最高位有進(jìn)位的情況,需要prev指針指向這個(gè)進(jìn)位節(jié)點(diǎn)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(head == NULL)
return NULL;
if(head->next == NULL)
return head;
struct ListNode *node;
node = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return node;
}
struct ListNode* plusOne(struct ListNode* head) {
struct ListNode *head1, *head2;
struct ListNode *p,*prev;
int val;
if(head == NULL )
return NULL;
head1 = reverseList(head);
p = head1;
val = p->val +1;
p->val = val%10;
int carry = val/10;
prev = p;
p = p->next;
while(p&&carry){
val = p->val+carry;
p->val = val%10;
carry = val/10;
prev = prev->next;
p = p->next;
}
if(carry){
printf("++");
struct ListNode *node = malloc(sizeof(struct ListNode));
node->val = carry;
node->next = NULL;
prev->next = node;
}
head2 = reverseList(head1);
return head2;
}
struct ListNode* plusOne(struct ListNode* head) {
struct ListNode *head1, *head2;
struct ListNode *p,*prev;
int val;
if(head == NULL )
return NULL;
head1 = reverseList(head);
p = head1;
val = p->val +1;
p->val = val%10;
int carry = val/10;
prev = p;
p = p->next;
while(p&&carry){
val = p->val+carry;
p->val = val%10;
carry = val/10;
prev = prev->next;
p = p->next;
}
if(carry){
printf("++");
struct ListNode *node = malloc(sizeof(struct ListNode));
node->val = carry;
node->next = NULL;
prev->next = node;
}
head2 = reverseList(head1);
return head2;
}