📌  相关文章
📜  用链表表示的数字加 1 的Python程序(1)

📅  最后修改于: 2023-12-03 15:40:56.236000             🧑  作者: Mango

用Python实现链表表示的数字加 1

本文介绍如何用Python实现链表表示的数字加 1的算法。具体来说,我们将一个单向链表视为存储十进制数字的数据结构,链表的每个节点分别对应一个数字位。我们的任务是将这个链表表示的数字加 1,然后返回一个链表。需注意,不允许将该链表转化为整数,除非该链表表示的数字本身已溢出long long的限制。

解题思路

我们以题目提交代码时,通过OJ的case点所需的时间和空间限制来分析可行性,以及算法效率。因此,在讲解解题思路时,我们需要考虑时间复杂度和空间复杂度。

方法一:迭代

算法步骤:

  • 我们从最后一个节点(个位)开始遍历该链表。
  • 对于当前节点,我们将其值加 1,并如果和为 10(即需要进位),则将其值设为 0,并将 carry(进位值)设为 1。
  • 如果当前节点不需要进位,直接将其值加 1,并返回这个链表作为答案。
  • 迭代至下一个节点,重复步骤 2 和 3。
  • 如果节点已经迭代完了,但 carry 仍为 1,说明还有一位需要进位,因此,在链表的最前面加一个值为 1 的新节点即可。

时间复杂度:链表长度为 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,最后返回链表头节点。

方法二:递归

递归的做法和迭代的做法类似,但从前往后遍历该链表。思路如下:

  • 递归到链表的最后一个节点并向前返回。如果链表为空,我们需要新建一个值为 1 的节点并返回。
  • 对于其它节点,我们只需要判断进位值 carry 是否等于 1。如果是,则其值需要加 1,否则不需要操作。
  • 将 carry 赋值为节点值是否大于等于 10,这里如果节点值大于等于 10,加上 1 之后需要进位。
  • 返回该节点,并在上层递归中处理上层的进位操作。

时间复杂度:链表长度为 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),只是算法思路有所不同。在解决实际问题时,我们需要根据具体情况选择更加高效的算法,以提高程序的性能。