1.3如何计算两个单链表代表的数之和

问题描述

给定两个单链表,链表的每个结点代表一位数,计算两个数的和。例如 :输入链表 (3一>1一> 5)和链表(5一>9一> 2),输出 :8->0->8,即 513+295 =808,注意个位数在链表头。

class Node:
def init(self, data=None, next=None):
self.data = data
self.next = next

输出链表

def print_link(head):
cur = head.next
while cur.next != None:
print(cur.data, end=' ')
cur = cur.next
print(cur.data)

输出计算结果,将结果链表逆置,从第一的不为0的节点开始输出

def print_str(head):
cur = head.next
f = 1
while cur.next != None:
if f and cur.data != 0:
print(cur.data, end='')
f = 0
elif f == 0:
print(cur.data, end='')
cur = cur.next
print(cur.data)

构造初始链表

def con_link(nums):
head = Node()
cur = head
for num in nums:
node = Node(num)
cur.next = node
cur = node
return head

按位计算,个位->十位->百位以此类推(大整数加法)

def min_compute(p1, p2, p3):
f = 0
while p1:
res = p1.data + p2.data + f
if res < 10:
p3.data = res
f = 0
else:
p3.data = res % 10
f = 1
p1 = p1.next
p2 = p2.next
p3 = p3.next
while p2:
res = p2.data + f
if res < 10:
p3.data = res
f = 0
else:
p3.data = res % 10
f = 1
p2 = p2.next
p3 = p3.next
if f == 1:
p3.data = f

逆转链表

def reverse_link(head):
if head.next == None or head == None:
return
pre = head.next
cur = head.next.next
pre.next = None
while cur.next != None:
next = cur.next
cur.next = pre
pre = cur
cur = next
cur.next = pre
head.next = cur
print_str(head)

def compute(head1, head2, length1, length2):
p1 = head1.next
p2 = head2.next
# 构造结果链表,考虑到进位的情况结果链表长度应该比加数位数多一位
nums = [0 for i in range(max(length1, length2) + 1)]
head3 = con_link(nums)
p3 = head3.next
# 两个加数长度不同时应该分别考虑
if length2 >= length1:
min_compute(p1, p2, p3)
else:
min_compute(p2, p1, p3)
reverse_link(head3)

if name == 'main':
s1 = input("link1>>:")
nums1 = list(map(int, s1.split(' ')))
length1 = len(nums1)
s2 = input("link2>>:")
nums2 = list(map(int, s2.split(' ')))
length2 = len(nums2)

link1 = con_link(nums1)
link2 = con_link(nums2)
print_link(link1)
print_link(link2)
compute(link1, link2, length1, length2)

posted @ 2019-09-04 12:43  上进的小苗同学  阅读(431)  评论(0)    收藏  举报