0
点赞
收藏
分享

微信扫一扫

两个链表生成相加链表

蒸熟的土豆 2021-09-24 阅读 132
算法

两个链表生成相加链表

题目描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。

给定两个这种链表,请生成代表两个整数相加值的结果链表。

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

示例

输入:[9,3,7],[6,3]

返回值:{1,0,0,0}

解题思路

小编看这道题看两两遍没懂啥意思,后来在草稿纸上写了这俩数字,才明白这道题是要我们把两个数字利用加法加起来,然后利用链表输出这个相加的数。

从小学开始就知道,加法应该是从个位开始计算,依次将计算位数递增,因此我们需要从个位开始对链表进行遍历——即反转输入的两个链表。

遍历的过程中需要考虑进位,这里我们考虑引入一个tag,用来标志是否需要进位补1。

遍历过程中需要考虑一个节点为空,而另一个节点不为空的情况。

如果原始链表遍历完成了,而tag没有归0,则表示还需要加一位,在栈中将1进位即可。

用一个栈储存加法计算的储存的节点,遍历结束后将栈中储存的节点反序连接,即可以获得相加的结果链表。

代码如下:

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

#
# 
# @param head1 ListNode类 
# @param head2 ListNode类 
# @return ListNode类
#
class Solution:
    def addInList(self , head1 , head2 ):
        # 将两个链表反转并返回链表头
        nHead1,nHead2=self.ReverseList(head1),self.ReverseList(head2)
        # 定义遍历节点,tag进位标志,stack储存相加的结果
        p1,p2,tag,stack=nHead1,nHead2,0,[]
        while p1 or p2:
            # p1为空且p2不为空
            if not p1 and p2:
                num = p2.val+tag
                # 和大于等于10,进位,且储存个位数
                if num>=10:
                    stack.append(ListNode(num%10))
                    tag=1
                # 和小于0,不进位,且储存个位数
                else:
                    stack.append(ListNode(num))
                    tag=0
                # p2向后遍历
                p2 = p2.next
            if not p2 and p1:
                num = p1.val+tag
                # 和大于等于10,进位,且储存个位数
                if num>=10:
                    stack.append(ListNode(num%10))
                    tag=1
                # 和小于0,不进位,且储存个位数
                else:
                    stack.append(ListNode(num))
                    tag=0
                # p1向后遍历
                p1 = p1.next
            if p1 and p2:
                num = p2.val+p1.val+tag
                # 和大于等于10,进位,且储存个位数
                if num>=10:
                    stack.append(ListNode(num%10))
                    tag=1
                # 和小于0,不进位,且储存个位数
                else:
                    stack.append(ListNode(num))
                    tag=0
                # p2,p1都向后遍历
                p2 = p2.next
                p1 = p1.next
        if tag==1:
            stack.append(ListNode(1))
        stack = stack[::-1]
        for i in range(len(stack)-1):
            stack[i].next=stack[i+1]
        return stack[0]
    def ReverseList(self, pHead):
        Now = pHead
        if not pHead:
            return 
        Next = Now.next
        if not Next:
            return pHead
        pre = Now
        pre.next = None
        while Next.next:
            pre = Now
            Now = Next
            Next = Next.next
            Now.next =pre
        Next.next = Now
        pHead = Next
        return pHead
举报

相关推荐

0 条评论