列表

详情


NC189. 给单链表加一

描述

给定一个用单链表表示的整数,然后把这个整数加一。

数据范围:链表长度满足 ,链表上每个节点的值满足 ,可以保证链表在非 0 的情况下没有前导零

例如输入{1,2,3}时,对应的输出为{1,2,4},转换过程如下图所示:

示例1

输入:

{1,2,3}

输出:

{1,2,4}

示例2

输入:

{1,2,0}

输出:

{1,2,1}

示例3

输入:

{9}

输出:

{1,0}

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 416KB, 提交时间: 2022-02-09

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /*
    方法一:反转链表再相加
    
    这个题可以看作是“链表反转”和“链表加法”两个题的结合:
    1. 先做一个链表的反转,让高位在头,低位在尾;
    2. 然后把1这个数字转化成一个只有一个节点的链表;
    3. 将以上两个链表模拟竖式加法,做一个链表两数之和;
    4. 最后把两数之和的链表反转过来返回。
    */
    ListNode* plusOne1(ListNode* head) {
        ListNode* head1 = reverseList(head);
        ListNode* head2 = new ListNode(1);
        return reverseList(addTwoNumbers(head1, head2));
    }
    
    /*
    方法二:递归
    */
    ListNode* plusOne(ListNode* head) {
        int carry = helper(head);
        if(carry != 0) {
            ListNode* root = new ListNode(carry);
            root->next = head;
            return root;
        }
        return head;
    }
    
private:
    //方法一调用
    ListNode* addTwoNumbers(ListNode* head1, ListNode* head2) {
        ListNode *p1 = head1, *p2 = head2;
        int carry = 0;
        ListNode* dummy = new ListNode(-1);
        ListNode* cur = dummy;
        while(p1 != NULL || p2 != NULL){
            int sum = carry + (p1 != NULL? p1->val: 0) + (p2 != NULL? p2->val: 0);
            cur->next = new ListNode(sum % 10);
            carry = sum / 10;
            if(p1 != NULL) p1 = p1->next;
            if(p2 != NULL) p2 = p2->next;
            cur = cur->next;
        }
        if(carry > 0) cur->next = new ListNode(carry);
        return dummy->next;
    }
     
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = NULL;
        ListNode* cur = head;
        while(cur != NULL){
            ListNode* next = cur->next;
            cur->next = prev;
            prev = cur;
            cur = next;
        }
        return prev;
    }
    
    //方法二调用
    int helper(ListNode *head) {
        if(head == NULL) return 1;
        int sum = head->val + helper(head->next);
        head->val = sum % 10;
        return sum / 10;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2022-03-14

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    ListNode* add1(ListNode* node,ListNode * parent){ // 节点和它的 父节点
        if(!node -> next){ // 最后一个节点直接加1
            node -> val ++;
        }else{
            add1(node->next, node); // 非最后一个递归向下
        }
        if(node -> val == 10){ // 进位
            node -> val = 0;
            if(parent){ // 有父节点
                parent -> val ++;
            }else{ // 根 无父节点
                parent = new ListNode(1);
                parent->next = node;
            }
        }
        return parent?parent:node; // 根是否进位
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* plusOne(ListNode* head) {
        return add1(head, NULL);
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2022-02-08

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* plusOne(ListNode* head) 
    {
        ListNode *newHead = reverseList(head);
        
        int remain = 1;
        
        ListNode *cur = newHead;
        ListNode *pre = cur;
        while(cur)
        {
            remain += cur->val;
            if(remain < 10)
            {
                cur->val = remain;
                break;
            }
            else
            {
                cur->val = remain - 10;
                remain = 1;
            }
            pre = cur;
            cur = cur->next;
        }
        
        if(cur==NULL && remain != 0)
        {
            ListNode *newNode = new ListNode(remain);
            pre->next = newNode;
        }
        
        return reverseList(newHead);
    }
    
    ListNode* reverseList(ListNode *head)
    {
        if(head == NULL || head->next == NULL)
            return head;
        
        ListNode *pre = NULL;
        ListNode *cur = head;
        ListNode *nxt = NULL;
        
        while(cur->next)
        {
            nxt = cur->next;
            cur->next = pre;
            
            pre = cur;
            cur = nxt;
        }
        
        cur->next = pre;
        return cur;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2021-12-19

// 序号:00003,遍数:001
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* plusOne(ListNode* head) {
        // write code here
        int x = helper(head);
        if(x != 0) {
            ListNode* root = new ListNode(x);
            root->next = head;
            return root;
        }
        return head;
    }
private:
    int helper(ListNode *nd) {
        if(nd == NULL) {
            return 1;
        }
        int sum = nd->val + helper(nd->next);
        nd->val = sum%10;
        return sum/10;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2021-12-07

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* plusOne(ListNode* head) {
        // write code here
        if(head == NULL) return head;
        int c = dfs(head);
        if(c > 0)
        {
            ListNode* dummy = new ListNode(c);
            dummy->next = head;
            return dummy;
        }
        return head;
        
    }
    int dfs(ListNode* head)
    {
        if(head == NULL) return 1;
        int c = dfs(head->next);
        c += head->val;
        if(c >= 10)
        {
            head->val = c%10;
            return 1;
        }
        else
        {
            head->val = c;
            return 0;
        }
    }
};

上一题