用链表实现大整数加减法操作
时间: 2023-05-23 18:06:28 浏览: 141
链表实现大整数加减法操作的思路如下:
1. 将两个大整数转换成链表,每个节点存储一个数字。
2. 遍历两个链表,从低位到高位逐一相加或相减两个节点的值,得到当前位的结果。
3. 如果相加或相减后的结果超过了10,需要将进位或借位记录下来,作为下一次计算的额外数值。
4. 如果两个链表长度不一致,需要先将短的链表用0节点补齐长度。
5. 最后得出的结果可能包含前导0,需要去除。
6. 将最终结果转换成链表返回。
下面是基于Python语言实现的代码,具体注释见代码中:
```
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
# 建立哑节点,简化边界条件判断
dummy = ListNode(0)
curr = dummy
carry = 0 # 进位值
while l1 or l2:
# 取出两个链表当前节点的值,如果没有节点则默认为0
val1 = l1.val if l1 else 0
val2 = l2.val if l2 else 0
# 计算当前位的和,加上上一次进位值
total = carry + val1 + val2
# 计算当前位的进位值,如果有则为1,否则为0
carry = 1 if total >= 10 else 0
# 计算当前位的实际值
curr.next = ListNode(total % 10)
curr = curr.next
# 遍历两个链表
if l1:
l1 = l1.next
if l2:
l2 = l2.next
# 判断最高位是否有进位值
if carry > 0:
curr.next = ListNode(carry)
return dummy.next
def subTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
# 建立哑节点,简化边界条件判断
dummy = ListNode(0)
curr = dummy
borrow = 0 # 借位值
while l1 or l2:
# 取出两个链表当前节点的值,如果没有节点则默认为0
val1 = l1.val if l1 else 0
val2 = l2.val if l2 else 0
# 计算当前位的差,减去上一次借位值
sub = val1 - val2 - borrow
# 计算当前位的借位值,如果有则为1,否则为0
borrow = 1 if sub < 0 else 0
# 计算当前位的实际值
curr.next = ListNode((sub + 10) % 10)
curr = curr.next
# 遍历两个链表
if l1:
l1 = l1.next
if l2:
l2 = l2.next
# 判断最高位是否有借位值
if borrow > 0:
curr.next = ListNode(borrow)
# 去除前导0
while dummy.next and dummy.next.val == 0:
dummy.next = dummy.next.next
return dummy.next
```
使用样例:
```
# 两个大整数相加
l1 = ListNode(2, ListNode(4, ListNode(3)))
l2 = ListNode(5, ListNode(6, ListNode(4)))
result = addTwoNumbers(l1, l2)
while result:
print(result.val)
result = result.next
# 输出:7 0 8
# 两个大整数相减
l3 = ListNode(9, ListNode(2, ListNode(3)))
l4 = ListNode(5, ListNode(6, ListNode(4)))
result = subTwoNumbers(l3, l4)
while result:
print(result.val)
result = result.next
# 输出:3 6 9
```