📅  最后修改于: 2023-12-03 15:40:56.236000             🧑  作者: Mango
本文介绍如何用Python实现链表表示的数字加 1的算法。具体来说,我们将一个单向链表视为存储十进制数字的数据结构,链表的每个节点分别对应一个数字位。我们的任务是将这个链表表示的数字加 1,然后返回一个链表。需注意,不允许将该链表转化为整数,除非该链表表示的数字本身已溢出long long的限制。
我们以题目提交代码时,通过OJ的case点所需的时间和空间限制来分析可行性,以及算法效率。因此,在讲解解题思路时,我们需要考虑时间复杂度和空间复杂度。
算法步骤:
时间复杂度:链表长度为 n,需要迭代一次,因此时间复杂度为 O(n)。
空间复杂度:只使用了常量级别的空间,因此空间复杂度为 O(1)。
代码实现:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def plusOne(self, head: ListNode) -> ListNode:
dummy = ListNode(0)
dummy.next = head
# find the rightmost digit that is not equal to 9
rightmost_not_nine = dummy
while head:
if head.val != 9:
rightmost_not_nine = head
head = head.next
# increase this digit by 1
rightmost_not_nine.val += 1
# set all digits to the right to 0
node = rightmost_not_nine.next
while node:
node.val = 0
node = node.next
return dummy if dummy.val else dummy.next
这里的 dummy 是一个“哨兵节点”,它的作用是使得 head 和 rightmost_not_nine 不需要单独考虑。具体来说,head 用于遍历整个链表,rightmost_not_nine 初始时指向 dummy,然后在遍历链表时,如果节点的值不为 9,则更新 rightmost_not_nine 的值,最终 rightmost_not_nine 就指向了我们需要加 1 的节点。接着,我们将 rightmost_not_nine 的值加 1,并将其右侧的所有节点的值改为 0,最后返回链表头节点。
递归的做法和迭代的做法类似,但从前往后遍历该链表。思路如下:
时间复杂度:链表长度为 n,需要迭代一次,因此时间复杂度为 O(n)。
空间复杂度:只使用了常量级别的空间,因此空间复杂度为 O(1)。
代码实现:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def plusOne(self, head: ListNode) -> ListNode:
def dfs(node):
if not node:
return ListNode(1)
node.next = dfs(node.next)
if node.next.val == 10:
node.next.val = 0
node.val += 1
return node
return dfs(head) if dfs(head).val != 0 else dfs(head).next
本篇文章介绍了两种用Python实现链表表示的数字加 1的方法:迭代和递归。两者时间复杂度和空间复杂度均为 O(n),只是算法思路有所不同。在解决实际问题时,我们需要根据具体情况选择更加高效的算法,以提高程序的性能。