自学内容网 自学内容网

两数相加(LeetCode)

题目

        给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

        请你将两个数相加,并以相同形式返回一个表示和的链表。

        你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

解题 

  1. 遍历链表:同时遍历两个链表,逐位相加。
  2. 处理进位:如果两位数字相加的和大于等于10,需要处理进位。
  3. 构建新链表:将每一位的和(取个位)存入新的链表节点中。
  4. 处理链表长度不同:如果一个链表比另一个链表短,需要继续处理剩下的部分。
  5. 处理最终进位:如果最后还有进位,需要在新链表的最后添加一个节点。 
# 创建链表节点类
class ListNode:
    def __init__(self, value=0, next_node=None):
        self.value = value  # 节点存储的值
        self.next = next_node  # 下一个节点的引用


def addTwoNumbers(list1, list2):
    dummy_head = ListNode(0)  # 创建哑节点(虚拟头节点)
    current_node = dummy_head  # 当前处理的节点
    carry_over = 0  # 初始化进位为0

    # 遍历两个链表
    while list1 is not None or list2 is not None:
        # 如果当前节点为空,节点值为0
        value1 = list1.value if list1 is not None else 0
        value2 = list2.value if list2 is not None else 0

        # 计算两个节点的和及进位
        total_sum = carry_over + value1 + value2
        carry_over = total_sum // 10  # 计算进位
        current_node.next = ListNode(total_sum % 10)  # 创建新的节点存储当前位的结果
        current_node = current_node.next

        # 移动到下一个节点
        if list1 is not None: list1 = list1.next
        if list2 is not None: list2 = list2.next

    # 检查最后的进位
    if carry_over > 0:
        current_node.next = ListNode(carry_over)

    return dummy_head.next  # 返回结果链表的头节点(哑节点的下一个节点)


# 示例用法
# l1: 2 -> 4 -> 3 (表示数字 342)
# l2: 5 -> 6 -> 4 (表示数字 465)
# 输出: 7 -> 0 -> 8 (表示数字 807)
l1 = ListNode(2, ListNode(4, ListNode(3)))
l2 = ListNode(5, ListNode(6, ListNode(4)))
result = addTwoNumbers(l1, l2)

# 输出结果链表
while result:
    print(result.value, end=' ')
    result = result.next
# 输出: 7 0 8

 7 0 8 

总结 

名词解释

  1. 链表(Linked List)

    • 链表是一种数据结构,其中每个元素(称为节点)包含一个值和一个指向下一个节点的引用(或指针)。
    • 在单向链表中,每个节点只指向下一个节点,最后一个节点指向 None,表示链表的结束。
  2. 节点(Node)

    • 节点是链表中的基本组成单位,每个节点包含两个部分:
      • 值(val):存储的数据。
      • 引用(next):指向下一个节点的指针。
  3. 哑节点(Dummy Node)

    • 哑节点是一个虚拟节点,不存储有效数据,仅用于简化链表的操作,如在链表开头插入新节点或简化链表的遍历。
    • 哑节点常常作为链表的头节点,最后返回哑节点的下一个节点作为链表的实际头节点。
  4. 进位(Carry)

    • 进位是指在数字相加时,当一位的和超过基数(例如十进制数中超过 9)时,将多出的部分传递到下一位。
    • 在本例中,两个个位数相加如果大于或等于 10,需要将 10 的倍数作为进位传递到下一位。
  5. 初始化(Initialization)

    • 初始化是指在使用变量或对象之前,将其设置为一个已知的初始状态或初始值。
    • 例如,carry 变量初始化为 0,表示没有进位。
  6. 遍历(Traversal)

    • 遍历是指依次访问数据结构中的每个元素。
    • 在本例中,遍历链表是指从头节点开始,逐个访问每个节点,直到访问到链表的末尾(None)。
  7. 引用(Reference)

    • 引用是一个变量,它指向另一变量或对象的内存地址。
    • 在链表中,节点的 next 属性是一个引用,指向下一个节点。
  • 理解链表的结构,如何遍历、插入节点、创建新节点。
  • 使用哑节点(dummy node)技巧简化链表操作。
  • 处理两个数字的逐位相加,包括进位(carry)的计算。
  • 同时遍历两个链表,处理不同长度链表的情况。

原文地址:https://blog.csdn.net/weixin_74254879/article/details/140625442

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!