给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 python编写
时间: 2025-03-11 08:05:55 AIGC 浏览: 102
好的,您提到的是经典的“两数相加”问题(LeetCode第2题)。在这个问题中,我们需要将两个以逆序存储的链表表示的非负整数相加,并返回一个新的链表来表示它们的和。下面是一个用Python实现该功能的例子:
```python
# 定义单向链表节点结构体
class ListNode:
def __init__(self, val=0, next=None):
self.val = val # 节点值
self.next = next # 下一节点引用
def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
dummy_head = ListNode() # 创建一个哑结点作为结果链表头部前驱
current_node = dummy_head # 当前操作指针指向dummy头
carry_over = 0 # 初始化进位标志
while l1 or l2 or carry_over > 0:
sum_val = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry_over
new_digit = sum_val % 10 # 计算当前位的真实数值
carry_over = sum_val // 10 # 更新进位状态
current_node.next = ListNode(new_digit) # 构建新结点连接到结果列表上
current_node = current_node.next # 移动current至下一位置继续构建
if l1 is not None: l1 = l1.next # 若L1还有剩余项则前进一位
if l2 is not None: l2 = l2.next # 同样对L2做此检查与移动
return dummy_head.next # 返回真正的首结点即去掉最初添加的那个虚拟head
# 辅助函数用于打印链表内容以便测试查看输出是否正确
def print_linked_list(node):
elements = []
while node:
elements.append(str(node.val))
node = node.next
print("->".join(elements))
# 测试示例代码片段:
if __name__ == "__main__":
# 示例链表创建
list1 = ListNode(2)
list1.next = ListNode(4)
list1.next.next = ListNode(3)
list2 = ListNode(5)
list2.next = ListNode(6)
list2.next.next = ListNode(4)
result = addTwoNumbers(list1, list2)
print_linked_list(result) # 应输出7->0->8
```
### 算法解释:
- 我们首先定义了一个`ListNode`类,它代表了我们使用的简单单链表的数据结构。
- 接下来,在`addTwoNumbers`函数里,我们引入了一个额外的变量叫做`carry_over`,用来跟踪每一次求和过程中产生的进位情况。
- 对于每一个对应的两位数字加上上次运算留下的进位之后得到的结果分为两部分处理——一部分是本位的实际取值(`new_digit`);另一部分则是传递给更高一位去考虑的新一轮"携带"(或称作借位).
- 最后一步就是通过迭代地遍历输入链表直到所有有效数据都被访问完毕为止,同时也要注意当最后几位都为零但是仍然存在进位的情况下也需要生成新的高位结点.
阅读全文
相关推荐


















