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

时间: 2024-10-13 20:16:58

1.3如何计算两个单链表代表的数之和的相关文章

判断两个单链表是否相交

题目描述: 给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false. 给定两个链表的头结点head1和head2.请返回一个bool值代表它们是否相交. 链表中节点的类型设置如下: class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 思路: 1.首先判断是否有环, 若两个链表都没有环,则进行无环单链表判断是否相

单链表 --- 合并两个单链表

合并单链表 --> 一.解决方法: 确保两个单链表不为空,且二者皆有序(若无序,则先进行排序) 创建新的单链表,并比较原本两个单链表数据大小,较小者置于新单链表中 逐步将两个单链表的数据置于新单链表中,直至二者为空 二.程序代码: ListNode* MergeList(ListNode *L1,ListNode *L2)//合并两个单链表 { ListNode *newHead=NULL; ListNode *tail=NULL; if(L1==NULL) { return L2; } if(

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:7_2判断两个单链表是否相交,若相交,求出第一个交点. 题目分析: 创建A,B两个单链表,将B的尾部指向头部,若两个单链表相交,则交点必为环的入口,这就又变成

判断两个单链表是否相交及相交的第一个节点

/* 问题: 1.判断两个单链表是否相交 2.找出第一个相交节点 解题思路: 1.若连个链表相交则从相交节点开始以后节点都是一样的 2.通过链表长度判断然后去寻找 */ #include<stdlib.h> #include<stdio.h> /* 创建节点 */ typedef struct STU { char a; struct STU *next; }*SListNode; SListNode ListA; SListNode ListB; /* 创建链表A */ SLis

求两个单链表公共结点

题目:输入两个单链表,找出公共结点. 思路:若两个单链表有公共结点,其形状必定为"Y"型,也就是说公共结点后的所有结点都是相同的. 我们首先获得两个链表的长度,求得长度之差为n,再定义两个指针分别指向两个链表首部,长链表先走n步,然后两个指针同时走,直到两个指针所指向的值完全相同时停止. 代码: /* 求链表公共结点 */ #include<stdio.h> #include<stdlib.h> typedef struct _NODE_ { int data;

10.两个单链表相交,计算相交点

10.两个单链表相交,计算相交点 思路1: 分别遍历两个单链表,计算出它们的长度M和N,假设M比N大,则长度M的链表先前进M-N,然后两个链表同时以步长1前进,前进的同时比较当前的元素,如果相同,则必是交点.Node* getIntersectPoint(Node* Head1,Node* Head2) //两链表相交,计算相交点 Node* getIntersectPoint(Node* Head1,Node* Head2) {   int len1=numOfNodes(Head1);  

9.判断两个单链表是否相交

9.判断两个单链表是否相交 注意这里是判断是否相交.对于判断问题来讲,相对还是比较简单的.注意单链表并非不能有重复元素. 思路1:O(len1*len2) 把第一个链表的指针值逐项存在hashtable中,遍历第2个链表的每一项的指针值,如果能在第一个链表中找到,则必然相交.但是C++的STL模板中的hash不太会用.所以我使用了set集合,不过貌似set集合是使用遍历的方式来查找元素是否在集合中的,所以效率是比较低的,至少在O(len1*len2)级别. bool judgeIntersect

【算法导论学习-23】两个单链表(single linked)求交点

问题:A.B两个单链表如果有交点,返回第一个交点在A中的位置(链表头结点位置为0). 分析:A.B如果有交点,交点的后继一定也是交点,所以一定是Y型相交,所以算法的思想如下 1)  求得A.B的长度,比如ALength,Blength 2)  判断ALength,Blength谁大,比如Alength>Blength 3)  Alength移动到Alength-Blength的位置,开始判断每个节点是否相等,相等则退出. 以本博客中"[算法导论学习-20]单链表(single linked

Java-找出两个单链表的首个公共节点

单链表中的简单算法 /** * 得到两个单链表的公共结点 * 先求出两个链表的长度,并求出二者的差值dif,两个指针分别指向链表头部,让指向长的链表的指针先向链表尾部移动dif步. * 最后一起一步步移动两个指针,当两个指针都指向同一个结点时,返回那个结点 * @param list1 * @param list2 * @return */ public static ListNode getFirstCommonNode(ListNode list1,ListNode list2){ if(l