Python 链表相加:算法解析和示例代码
首先,我们需要定义一个链表的节点类,表示链表中的每个节点。节点类需要包含一个值属性和一个指向下一个节点的指针。
接下来,我们可以根据题目的要求来实现相加操作。由于两个链表的长度可能不同,我们可以使用一个进位变量来记录上一位相加的进位,并将进位一直传递下去。
具体步骤如下:
- 创建一个节点类
ListNode:- 包含一个
val属性,表示节点的值。 - 包含一个
next指针,指向下一个节点,默认为None。
- 包含一个
- 创建一个函数
addTwoNumbers,接收两个链表头节点l1和l2:- 创建一个新的链表的头节点
dummy和一个当前节点curr,初始都指向None。 - 创建一个进位变量
carry,初始值为 0。 - 遍历链表
l1和l2,直到两个链表都遍历完:- 分别获取链表
l1和l2当前节点的值x和y,如果链表已经遍历完,则值为 0。 - 计算当前位的和
sum = x + y + carry,和的个位数作为当前节点的值,和的十位数作为进位值。 - 创建一个新节点,值为和的个位数,将其作为当前节点的下一个节点。
- 更新当前节点为新节点。
- 更新进位值为和的十位数。
- 链表
l1和l2同时向后移动一位。
- 分别获取链表
- 如果最后的进位值不为 0,则创建一个新节点,值为进位值,将其作为当前节点的下一个节点。
- 返回新链表的头节点
dummy.next,即链表的第一个有效节点。
- 创建一个新的链表的头节点
- 测试函数:
- 创建两个链表表示的两个数:链表
l1和l2。 - 调用函数
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 著作权归作者所有。请勿转载和采集!