用链表表示的两个数字相加的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。
步骤是:
- 从头到尾遍历两个链表
- 从各自的链表中添加两个数字。
- 如果其中一个列表已到达末尾,则将 0 作为其数字。
- 继续它直到列表的末尾。
- 如果两位数之和大于 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 了解更多详情!