Given the head of a singly linked list, reverse the list, and return the reversed list.
The linked list represents a non-negative integer. Add one to the number represented by the linked list. The digits are stored such that the most significant digit is at the head of the list.
Example 1:
Input: head = [1,2,3]
Output: [1,2,4]
Example 2:
Input: head = [9,9,9]
Output: [1,0,0,0]
Constraints:
[1, 100]0 <= Node.val <= 9When you get asked this question in a real-life environment, it will often be ambiguous (especially at FAANG). Make sure to ask these questions in that case:
We need to add one to a number represented as a linked list. The most straightforward way is to convert the linked list into a regular number, add one to it, and then convert the new number back into a linked list.
Here's how the algorithm would work step-by-step:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def plus_one_linked_list(head):
# Convert linked list to integer
number_from_list = 0
while head:
number_from_list = number_from_list * 10 + head.val
head = head.next
# Add one to the integer
number_from_list += 1
# Handle the case where the number is zero
if number_from_list == 0:
return ListNode(0)
# Convert integer back to linked list
dummy_head = ListNode(0)
current_node = dummy_head
# We construct the linked list in reverse order
number_as_string = str(number_from_list)
for digit in number_as_string:
current_node.next = ListNode(int(digit))
current_node = current_node.next
# The dummy node is removed, but we must do so after the list has been created.
return dummy_head.nextWe need to add one to a number represented as a linked list. The efficient way is to traverse the list from the end, adding one and handling any carry-over to the next digit until either the carry-over is resolved or we reach the start of the list.
Here's how the algorithm would work step-by-step:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def plus_one_linked_list(head):
sentinel_head = ListNode(0)
sentinel_head.next = head
not_nine = sentinel_head
current_node = head
while current_node:
if current_node.val != 9:
not_nine = current_node
current_node = current_node.next
# Increment the rightmost non-nine digit
not_nine.val += 1
# Set all the following nines to zero
current_node = not_nine.next
while current_node:
current_node.val = 0
current_node = current_node.next
# If the sentinel node is not zero, it means we had all nines
if sentinel_head.val != 0:
return sentinel_head
else:
return sentinel_head.next| Case | How to Handle |
|---|---|
| Empty linked list (head is null) | Return a new linked list with a single node containing the value 1, as adding one to zero is one. |
| Linked list representing a number with all 9s (e.g., 9 -> 9 -> 9) | Handle the carry propagation correctly by adding a new node with value 1 at the beginning if the carry remains after processing all digits. |
| Single-digit linked list representing the number 9 | Change the node's value to 0 and prepend a new node with value 1 to the list. |
| Integer overflow during carry propagation (language specific, but important to consider if using a less common language) | The linked list representation inherently avoids integer overflow issues since each node stores only a single digit. |
| Negative numbers in the linked list (invalid input according to the problem) | Throw an IllegalArgumentException or return null, indicating that negative numbers are not supported. |
| Maximum-sized linked list allowed by memory constraints | Ensure the algorithm uses constant extra space (O(1)) and avoids unnecessary memory allocations to prevent memory errors for extremely large lists. |
| Linked list with leading zeros (e.g., 0 -> 0 -> 1 -> 2 -> 3) | The problem deals with adding one to the number the list represents; leading zeros are handled as if they were not there by ignoring them. |
| Very long linked list where iterative solution may cause stack overflow in some language (though linked lists aren't typically that long) | An iterative approach should be preferred over a recursive approach to avoid potential stack overflow issues with exceptionally long linked lists. |