用链表实现两个超大整数相加
时间: 2023-05-30 07:03:40 浏览: 243
用链表实现大数相加减.doc
假设我们有两个超大整数num1和num2,我们可以使用链表来存储它们,每个节点存储一个数字。为了方便计算,我们可以将链表尾部对齐,不足的地方用0填充。
首先,我们从链表头开始遍历两个链表,同时将每个节点的数字相加,并记录进位。如果某一链表先到达尾部,那么我们可以将其余部分视为0继续相加。最终,我们可以得到一个新的链表,它存储了相加后的结果。
需要注意的是,如果最高位有进位,我们需要在结果链表的头部添加一个节点,表示进位。
下面是代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def addTwoNumbers(self, num1: ListNode, num2: ListNode) -> ListNode:
# 将链表对齐
len1 = self.getLength(num1)
len2 = self.getLength(num2)
if len1 > len2:
num2 = self.padList(num2, len1-len2)
else:
num1 = self.padList(num1, len2-len1)
# 相加
carry = 0
dummy = ListNode()
curr = dummy
while num1:
total = num1.val + num2.val + carry
carry = total // 10
curr.next = ListNode(total % 10)
curr = curr.next
num1 = num1.next
num2 = num2.next
# 处理最高位的进位
if carry:
curr.next = ListNode(carry)
return dummy.next
def getLength(self, head: ListNode) -> int:
n = 0
while head:
n += 1
head = head.next
return n
def padList(self, head: ListNode, n: int) -> ListNode:
for i in range(n):
head = ListNode(0, head)
return head
```
时间复杂度为O(max(m,n)),其中m和n分别为两个链表的长度。空间复杂度为O(max(m,n)),因为我们需要创建一个新的链表来存储结果。
阅读全文