📌  相关文章
📜  用链表表示的两个数字相加的Python程序 - 集 1

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

用链表表示的两个数字相加的Python程序 - 集 1

给定由两个列表表示的两个数字,编写一个返回和列表的函数。和列表是两个输入数字相加的列表表示。

示例

Input: List1: 5->6->3 // represents number 563 List2: 8->4->2 // represents number 842 Output: Resultant list: 1->4->0->5 // represents number 1405 Explanation: 563 + 842 = 1405

Input: List1: 7->5->9->4->6 // represents number 75946List2: 8->4 // represents number 84Output: Resultant list: 7->6->0->3->0// represents number 76030Explanation: 75946+84=76030

方法:遍历两个列表,并一个接一个地选择两个列表的节点并添加值。如果总和大于 10,则进位为 1 并减少总和。如果一个列表的元素多于另一个,则将此列表的其余值视为 0。

步骤是:

  1. 从头到尾遍历两个链表
  2. 从各自的链表中添加两个数字。
  3. 如果其中一个列表已到达末尾,则将 0 作为其数字。
  4. 继续它直到列表的末尾。
  5. 如果两位数之和大于 9,则设置进位为 1,当前位数为sum % 10

下面是这种方法的实现。

Python
# Python program to add two numbers 
# represented by linked list
  
# Node class
class Node:
  
    # Constructor to initialize the 
    # node object
    def __init__(self, data):
        self.data = data
        self.next = None
  
  
class LinkedList:
  
    # Function to initialize head
    def __init__(self):
        self.head = None
  
    # Function to insert a new node at 
    # the beginning
    def push(self, new_data):
        new_node = Node(new_data)
        new_node.next = self.head
        self.head = new_node
  
    # Add contents of two linked lists and 
    # return the head node of resultant list
    def addTwoLists(self, first, second):
        prev = None
        temp = None
        carry = 0
  
        # While both list exists
        while(first is not None or 
              second is not None):
  
            # Calculate the value of next digit 
            # in resultant list
            # The next digit is sum of following 
            # things
            # (i) Carry
            # (ii) Next digit of first list (if 
            # there is a next digit)
            # (iii) Next digit of second list (if 
            # there is a next digit)
            fdata = 0 if first is None else first.data
            sdata = 0 if second is None else second.data
            Sum = carry + fdata + sdata
  
            # Update carry for next calculation
            carry = 1 if Sum >= 10 else 0
  
            # Update sum if it is greater than 10
            Sum = Sum if Sum < 10 else Sum % 10
  
            # Create a new node with sum as data
            temp = Node(Sum)
  
            # if this is the first node then set 
            # it as head of resultant list
            if self.head is None:
                self.head = temp
            else:
                prev.next = temp
  
            # Set prev for next insertion
            prev = temp
  
            # Move first and second pointers to 
            # next nodes
            if first is not None:
                first = first.next
            if second is not None:
                second = second.next
  
        if carry > 0:
            temp.next = Node(carry)
  
    # Utility function to print the 
    # linked LinkedList
    def printList(self):
        temp = self.head
        while(temp):
            print temp.data,
            temp = temp.next
  
  
# Driver code
first = LinkedList()
second = LinkedList()
  
# Create first list
first.push(6)
first.push(4)
first.push(9)
first.push(5)
first.push(7)
print "First List is ",
first.printList()
  
# Create second list
second.push(4)
second.push(8)
print "
Second List is ",
second.printList()
  
# Add the two lists and see result
res = LinkedList()
res.addTwoLists(first.head, second.head)
print "
Resultant list is ",
res.printList()
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)


输出:

First List is 7 5 9 4 6 
Second List is 8 4 
Resultant list is 5 0 0 5 6 

复杂性分析:

  • 时间复杂度: O(m + n),其中 m 和 n 分别是第一个和第二个列表中的节点数。
    列表只需要遍历一次。
  • 空间复杂度: O(m + n)。
    需要一个临时链表来存储输出编号

相关文章:用链表表示的两个数相加 |设置 2

请参考完整的文章添加链表表示的两个数字 |设置 1 了解更多详情!