首先,我们需要定义一个链表的节点类,表示链表中的每个节点。节点类需要包含一个值属性和一个指向下一个节点的指针。

接下来,我们可以根据题目的要求来实现相加操作。由于两个链表的长度可能不同,我们可以使用一个进位变量来记录上一位相加的进位,并将进位一直传递下去。

具体步骤如下:

  1. 创建一个节点类 ListNode
    • 包含一个 val 属性,表示节点的值。
    • 包含一个 next 指针,指向下一个节点,默认为 None
  2. 创建一个函数 addTwoNumbers,接收两个链表头节点 l1l2
    • 创建一个新的链表的头节点 dummy 和一个当前节点 curr,初始都指向 None
    • 创建一个进位变量 carry,初始值为 0。
    • 遍历链表 l1l2,直到两个链表都遍历完:
      • 分别获取链表 l1l2 当前节点的值 xy,如果链表已经遍历完,则值为 0。
      • 计算当前位的和 sum = x + y + carry,和的个位数作为当前节点的值,和的十位数作为进位值。
      • 创建一个新节点,值为和的个位数,将其作为当前节点的下一个节点。
      • 更新当前节点为新节点。
      • 更新进位值为和的十位数。
      • 链表 l1l2 同时向后移动一位。
    • 如果最后的进位值不为 0,则创建一个新节点,值为进位值,将其作为当前节点的下一个节点。
    • 返回新链表的头节点 dummy.next,即链表的第一个有效节点。
  3. 测试函数:
    • 创建两个链表表示的两个数:链表 l1l2
    • 调用函数 addTwoNumbers(l1, l2),得到相加后的链表。
    • 遍历相加后的链表,依次打印每个节点的值。

以下是示例代码:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def addTwoNumbers(l1, l2):
    dummy = ListNode()  # 创建一个新链表的头节点
    curr = dummy  # 当前节点指向头节点
    carry = 0  # 进位变量,初始值为0

    while l1 or l2:  # 遍历链表
        x = l1.val if l1 else 0  # 获取l1当前节点的值
        y = l2.val if l2 else 0  # 获取l2当前节点的值
        _sum = x + y + carry  # 计算当前位的和

        carry = _sum // 10  # 计算进位值
        curr.next = ListNode(_sum % 10)  # 创建新节点,值为和的个位数
        curr = curr.next  # 更新当前节点

        if l1:  # 链表l1向后移动一位
            l1 = l1.next
        if l2:  # 链表l2向后移动一位
            l2 = l2.next

    if carry:  # 如果进位值不为0,创建新节点,值为进位值
        curr.next = ListNode(carry)

    return dummy.next  # 返回新链表的头节点

# 测试示例
l1 = ListNode(2)
l1.next = ListNode(4)
l1.next.next = ListNode(3)

l2 = ListNode(5)
l2.next = ListNode(6)
l2.next.next = ListNode(4)

result = addTwoNumbers(l1, l2)

while result:  # 遍历链表,打印每个节点的值
    print(result.val)
    result = result.next

以上代码中的 addTwoNumbers 函数使用了迭代的方式来计算链表的和,时间复杂度为 O(max(m, n)),其中 m 和 n 分别为两个链表的长度。


原文地址: https://www.cveoy.top/t/topic/siB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录