📌  相关文章
📜  用链表表示的两个数字相减的Python程序

📅  最后修改于: 2022-05-13 01:57:43.469000             🧑  作者: Mango

用链表表示的两个数字相减的Python程序

给定两个表示两个大正数的链表。从较大的数字中减去较小的数字,并将差值作为链表返回。请注意,输入列表可以是任何顺序,但我们总是需要从较大的列表中减去较小的列表。
可以假设输入列表中没有额外的前导零。
例子:

Input: l1 = 1 -> 0 -> 0 -> NULL,  l2 = 1 -> NULL
Output: 0->9->9->NULL
Explanation: Number represented as 
lists are 100 and 1, so 100 - 1 is 099

Input: l1 = 7-> 8 -> 6 -> NULL,  l2 = 7 -> 8 -> 9 NULL
Output: 3->NULL
Explanation: Number represented as 
lists are 786 and  789, so 789 - 786 is 3, 
as the smaller value is subtracted from 
the larger one.

方法:以下是步骤。

  1. 计算给定两个链表的大小。
  2. 如果大小不同,则在较小的链表中附加零。
  3. 如果大小相同,请按照以下步骤操作:
    1. 找到较小值的链表。
    2. 从较大的链表中一一减去较小链表的节点。减法时跟踪借位。

以下是上述方法的实现。

Python
# Python program to subtract smaller 
# valued list from larger valued list 
# and return result as a list.
  
# A linked List Node
class Node: 
    def __init__(self, new_data): 
        self.data = new_data 
        self.next = None
  
# A utility which creates Node.
def newNode(data):
    temp = Node(0)
    temp.data = data
    temp.next = None
    return temp
  
# A utility function to get 
# length of linked list 
def getLength(Node):
    size = 0
  
    while (Node != None):    
        Node = Node.next
        size = size + 1
      
    return size
  
# A Utility that padds zeros in 
# front of the Node, with the 
# given diff 
def paddZeros(sNode, diff):
    if (sNode == None):
        return None
  
    zHead = newNode(0)
    diff = diff - 1
    temp = zHead
    while (diff > 0):
        diff = diff - 1
        temp.next = newNode(0)
        temp = temp.next
      
    temp.next = sNode
    return zHead
  
borrow = True
  
# Subtract LinkedList Helper is a 
# recursive function, move till the 
# last Node, and subtract the digits 
# and create the Node and return the 
# Node. If d1 < d2, we borrow the number 
# from previous digit. 
def subtractLinkedListHelper(l1, l2):
    global borrow
      
    if (l1 == None and 
        l2 == None and not borrow ):
        return None
  
    l3 = None
    l4 = None
    if(l1 != None):
        l3 = l1.next
    if(l2 != None):
        l4 = l2.next
    previous = 
    subtractLinkedListHelper(l3, l4)
  
    d1 = l1.data
    d2 = l2.data
    sub = 0
  
    # If you have given the value value 
    # to next digit then reduce the d1 by 1 
    if (borrow):
        d1 = d1 - 1
        borrow = False
      
    # If d1 < d2, then borrow the number 
    # from previous digit. Add 10 to d1 
    # and set borrow = True 
    if (d1 < d2):
        borrow = True
        d1 = d1 + 10
  
    # Subtract the digits 
    sub = d1 - d2
  
    # Create a Node with sub value 
    current = newNode(sub)
  
    # Set the Next pointer as Previous 
    current.next = previous
  
    return current
  
# This API subtracts two linked lists 
# and returns the linked list which 
# shall have the subtracted result. 
def subtractLinkedList(l1, l2):
  
    # Base Case.
    if (l1 == None and l2 == None):
        return None
  
    # In either of the case, get the 
    # lengths of both
    # Linked list.
    len1 = getLength(l1)
    len2 = getLength(l2)
  
    lNode = None
    sNode = None
  
    temp1 = l1
    temp2 = l2
  
    # If lengths differ, calculate the 
    # smaller Node and padd zeros for 
    # smaller Node and ensure both larger 
    # Node and smaller Node has equal length.
    if (len1 != len2):
        if(len1 > len2):
            lNode = l1
        else:
            lNode = l2
          
        if(len1 > len2):
            sNode = l2
        else:
            sNode = l1
        sNode = paddZeros(sNode, 
                          abs(len1 - len2))
      
    else:
      
        # If both list lengths are equal, then 
        # calculate the larger and smaller list. 
        # If 5-6-7 & 5-6-8 are linked list, then 
        # walk through linked list at last Node 
        # as 7 < 8, larger Node is 5-6-8 and 
        # smaller Node is 5-6-7.
        while (l1 != None and l2 != None):        
            if (l1.data != l2.data):
                if(l1.data > l2.data ):
                    lNode = temp1 
                else:
                    lNode = temp2
                  
                if(l1.data > l2.data ):
                    sNode = temp2 
                else:
                    sNode = temp1
                break
              
            l1 = l1.next
            l2 = l2.next
          
    global borrow
      
    # After calculating larger and smaller 
    # Node, call subtractLinkedListHelper 
    # which returns the subtracted
    # linked list.
    borrow = False
    return subtractLinkedListHelper(lNode, 
                                    sNode)
  
# A utility function to print 
# linked list 
def printList(Node):
    while (Node != None):    
        print (Node.data, 
               end =" ")
        Node = Node.next    
    print(" ")
  
# Driver code
head1 = newNode(1)
head1.next = newNode(0)
head1.next.next = newNode(0)
head2 = newNode(1)
result = subtractLinkedList(head1, head2)
printList(result)
# This code is contributed by Arnab Kundu


输出:

0 9 9 

复杂性分析:

  • 时间复杂度: O(n)。
    因为不需要嵌套遍历链表。
  • 辅助空间: O(n)。
    如果考虑递归堆栈空间,则需要 O(n) 空间。

有关更多详细信息,请参阅有关以链接列表表示的减去两个数字的完整文章!