04计算两个单链表所代表的数之和★★★★

  • ​​题目描述(难度:中等)​​
  • ​​单链表结构​​
  • ​​方法一:链表相加​​
  • ​​复杂度分析​​
  • ​​主函数​​
  • ​​参考文献​​

题目描述(难度:中等)

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

单链表结构

04计算两个单链表所代表的数之和★★★★_链表

class LNode:
def __init__(self):
self.data = None # 数据域
self.next = None # 指针域
  • 由于单链表中每个结点的地址都存储在其前驱结点的指针域中,因此,对单链表中任何一个结点的访问只能从链表的头指针开始进行遍历。
  • 注意:在修改结点指针域的时候,记录下后继结点的地址,否则会丢失后继结点。

方法一:链表相加

04计算两个单链表所代表的数之和★★★★_算法_02

# 对两个带头结点的单链表所代表的数相加
def add(h1, h2):
if h1 is None or h1.next is None:
return h2
if h2 is None or h2.next is None:
return h1
c = 0 # 用来记录进位
sums = 0 # 用来记录两个结点相加的值
p1 = h1.next # 用来遍历h1
p2 = h2.next # 用来遍历h2
tmp = None # 用来指向新创建的存储相加和的结点
resultHead = LNode() # 相加后链表头结点
resultHead.next = None
p = resultHead # 用来指向链表resultHead最后一个结点
while p1 is not None and p2 is not None:
tmp = LNode()
tmp.next = None
sums = p1.data+p2.data+c
tmp.data = sums % 10 # 两结点相加和
c = sums//10 # 进位
p.next = tmp
p = tmp
p1 = p1.next
p2 = p2.next
# 链表h2比h1长,接下来只需要考虑h2剩余结点的值
if p1 is None:
while p2 is not None:
tmp = LNode()
tmp.next = None
sums = p2.data+c
tmp.data = sums % 10
c = sums/10
p.next = tmp
p = tmp
p2 = p2.next
# 链表h1比h2长,接下来只需要考虑h1剩余结点的值
if p2 is None:
while p1 is not None:
tmp = LNode()
tmp.next = None
sums = p1.data+c
tmp.data = sums % 10
c = sums/10
p.next = tmp
p = tmp
p1 = p1.next
# 如果计算完成后还有进位,则增加新的结点
if c == 1:
tmp = LNode()
tmp.next = None
tmp.data = 1
p.next = tmp
return resultHead

复杂度分析

  • 时间复杂度为04计算两个单链表所代表的数之和★★★★_头结点_03
  • 空间复杂度为04计算两个单链表所代表的数之和★★★★_头结点_03

主函数

if __name__ == "__main__":
i = 1
head1 = LNode()
head1.next = None
head2 = LNode()
head2.next = None
cur = head1
addResult = None
# 构造第一个链表
link1 = [3, 1, 5]
for i in link1:
tmp = LNode()
tmp.data = i
tmp.next = None
cur.next = tmp
cur = tmp
cur = head2
# 构造第二个链表
link2 = [5, 9, 2]
for i in link2:
tmp = LNode()
tmp.data = i
tmp.next = None
cur.next = tmp
cur = tmp
print("\nHead1: ", end='')
cur = head1.next
while cur is not None:
print(cur.data, '', end='')
cur = cur.next
print("\nHead2: ", end='')
cur = head2.next
while cur is not None:
print(cur.data, '', end='')
cur = cur.next
addResult = add(head1, head2)
print("\n相加后: ", end='')
cur = addResult.next
while cur is not None:
print(cur.data, '', end='')
cur = cur.next

参考文献

[1] 何海涛. 剑指Offer:名企面试官精讲典型编程题(第2版). 北京: 电子工业出版社,2017
[2] 张波,楚秦. Python程序员面试算法宝典. 北京:机械工业出版社,2018