题目描述:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
实现代码:
# -*- coding: utf-8 -*-
# 题目描述: 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,
# 它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
# 你可以假设除了数字 0 之外,这两个数字都不会以零开头。
# 首先定义链表节点
class Node:
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_
# 定义链表,只有两个方法:初始化链表和头部插入
class List:
def __init__(self):
self.head = None
def is_empty(self):
return self.head == None
def addFir(self, elem):
self.head = Node(elem, self.head)
def addEnd(self, elem):
p = self.head
if not p:
self.head = Node(elem, self.head)
else:
while p.next:
p = p.next
p.next = Node(elem)
# 定义方法,用于两个链表数相加
def addList(List1, List2):
newList = List()
p1, p2 = List1.head, List2.head
overValue = 0
while p1 and p2:
# p1, p2为浮标,用于分别表示两个链表的位置
elemInit = p1.elem + p2.elem
# 得到当前节点数相加的值
p1, p2 = p1.next, p2.next
# 继续下一个节点
if overValue == 1:
elemInit += 1
overValue = 0
if elemInit >= 10:
# 这是对相加起来大于10的情况的处理
elem = elemInit - 10
overValue = 1
newList.addEnd(elem)
continue
newList.addEnd(elemInit)
while not p1 and p2:
elemInit = p2.elem
if overValue == 1:
elemInit += 1
overValue = 0
if elemInit >= 10:
elem = elemInit - 10
overValue = 1
newList.addEnd(elem)
else:
newList.addEnd(elemInit)
p2 = p2.next
while not p2 and p1:
elemInit = p1.elem
if overValue == 1:
elemInit += 1
overValue = 0
if elemInit >= 10:
elem = elemInit - 10
overValue = 1
newList.addEnd(elem)
else:
newList.addEnd(elemInit)
p1 = p1.next
return newList
x = List()
for i in (2,2,3):
x.addFir(i)
y = List()
for i in (3,):
y.addFir(i)
# 以上建立两个数字链表
n = addList(x, y)
p = n.head
while p:
print(p.elem)
p = p.next