两数相加

题目描述:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值