美文网首页
369. Plus One Linked List

369. Plus One Linked List

作者: Nancyberry | 来源:发表于2018-05-26 11:42 被阅读0次

    Description

    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

    Solution

    Reverse list, O(n), S(1)

    reverse + add + reverse

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode plusOne(ListNode head) {
            head = reverse(head);
            int carry = 1;
            ListNode curr = head;
            
            while (carry > 0 && curr != null) {
                carry += curr.val;
                curr.val = carry % 10;
                curr = curr.next;
                carry /= 10;
            }
            
            head = reverse(head);
            
            if (carry > 0) {
                ListNode newHead = new ListNode(carry);
                newHead.next = head;
                return newHead;
            }
            
            return head;
        }
        
        private ListNode reverse(ListNode head) {
            ListNode prev = null;
            
            while (head != null) {
                ListNode next = head.next;
                head.next = prev;
                prev = head;
                head = next;
            }
            
            return prev;
        }
    }
    

    Tail recursion, O(n), S(n)

    这种尾递归的解法挺不错的,取巧的地方是,head == null时返回1,因为原本就是要add 1.

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode plusOne(ListNode head) {
            int carry = dfs(head);
            if (carry > 0) {
                ListNode newHead = new ListNode(carry);
                newHead.next = head;
                head = newHead;
            }
            
            return head;
        }
        
        public int dfs(ListNode head) {
            if (head == null) {
                return 1;   // add 1 by default
            }
            
            int carry = dfs(head.next);
            if (carry == 0) {
                return carry;
            }
            
            int val = head.val + carry;
            head.val = val % 10;
            return val / 10;
        }
    }
    

    相关文章

      网友评论

          本文标题:369. Plus One Linked List

          本文链接:https://www.haomeiwen.com/subject/deqmjftx.html