首页 > 代码库 > LeetCode Plus One Linked List
LeetCode Plus One Linked List
原题链接在这里:https://leetcode.com/problems/plus-one-linked-list/
题目:
Given a non-negative number represented as a singly linked list of digits, plus one to the number.
The digits are stored such that the most significant digit is at the head of the list.
Example:
Input:1->2->3Output:1->2->4
题解:
Method 1:
末位加一,若是有进位,就要在 Linked List 的前一个 Node 做改动,自然而然想到先Reverse Linked List. 从头开始做比较方便. 加完再reverse回来.
Time Complexity: O(n). reverse 用O(n), reverse 两次 加上 iterate 一次.
Space: O(1).
AC Java:
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 public class Solution {10 public ListNode plusOne(ListNode head) {11 if(head == null){12 return head;13 }14 ListNode tail = reverse(head);15 ListNode cur = tail;16 ListNode pre = cur;17 int carry = 1;18 19 while(cur != null){20 pre = cur;21 int sum = cur.val + carry;22 cur.val = sum%10;23 carry = sum/10;24 if(carry == 0){25 break;26 }27 cur = cur.next;28 }29 if(carry == 1){30 pre.next = new ListNode(1);31 }32 return reverse(tail);33 }34 35 private ListNode reverse(ListNode head){36 if(head == null || head.next == null){37 return head;38 }39 ListNode tail = head;40 ListNode cur = head;41 ListNode pre;42 ListNode temp;43 44 while(tail.next != null){45 pre = cur;46 cur = tail.next;47 temp = cur.next;48 cur.next = pre;49 tail.next = temp;50 }51 return cur;52 }53 }
Method 2:
利用递归,因为递归的终止条件就是到了末尾节点,每层向上返回一个carry数值.
Time Complexity: O(n), 最多每个节点iterate两遍.
Space: O(n), recursion用了n层stack.
AC Java:
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 public class Solution {10 public ListNode plusOne(ListNode head) {11 if(head == null){12 return head;13 }14 int carry = dfs(head);15 if(carry == 1){16 ListNode dummy = new ListNode(1);17 dummy.next = head;18 return dummy;19 }20 return head;21 }22 23 private int dfs(ListNode head){24 if(head == null){25 return 1;26 }27 int carry = dfs(head.next);28 int sum = head.val + carry;29 head.val = sum%10;30 return sum/10;31 }32 }
Method 3:
和Method 2原题相同,用stack代替recursion.
Time Complexity: O(n).
Space: O(n). Stack 大小.
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 public class Solution {10 public ListNode plusOne(ListNode head) {11 if(head == null){12 return head;13 }14 Stack<ListNode> stk = new Stack<ListNode>();15 ListNode cur = head;16 while(cur != null){17 stk.push(cur);18 cur = cur.next;19 }20 int carry = 1;21 while(!stk.isEmpty() && carry == 1){22 ListNode top = stk.pop();23 int sum = top.val + carry;24 top.val = sum%10;25 carry = sum/10;26 }27 if(carry == 1){28 ListNode dummy = new ListNode(1);29 dummy.next = head;30 return dummy;31 }32 return head;33 }34 }
Method 4:
从右向左寻找第一个不是9的节点,找到后在该节点加一, 若是他后面还有节点, 说明后面的节点都是9, 所以都要变成0.
Time Complexity: O(n).
Space: O(1).
AC Java:
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 public class Solution {10 public ListNode plusOne(ListNode head) {11 if(head == null){12 return head;13 }14 Stack<ListNode> stk = new Stack<ListNode>();15 ListNode cur = head;16 while(cur != null){17 stk.push(cur);18 cur = cur.next;19 }20 int carry = 1;21 while(!stk.isEmpty() && carry == 1){22 ListNode top = stk.pop();23 int sum = top.val + carry;24 top.val = sum%10;25 carry = sum/10;26 }27 if(carry == 1){28 ListNode dummy = new ListNode(1);29 dummy.next = head;30 return dummy;31 }32 return head;33 }34 }
LeetCode Plus One Linked List