• 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)
  • 相关阅读:
    27. 移除元素-数组-简单
    26. 删除排序数组中的重复项-数组-简单
    25. K 个一组翻转链表-链表-困难
    24. 两两交换链表中的节点-链表、递归-中等难度
    23. 合并K个排序链表-链表-困难
    21. 合并两个有序链表-链表-简单
    20. 有效的括号-栈-简单
    19. 删除链表的倒数第N个节点-链表-中等难度
    17. 电话号码的字母组合-dfs-中等难度
    16. 最接近的三数之和-dfs-中等难度
  • 原文地址:https://www.cnblogs.com/miao-study/p/11458436.html
Copyright © 2020-2023  润新知