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

时间:2019-09-04
本文章向大家介绍1.3如何计算两个单链表代表的数之和,主要包括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)

原文地址:https://www.cnblogs.com/miao-study/p/11458436.html