【题目】
假设链表中每一个节点的值都在0~9之间,那么链表整体就可以代表一个整数。
例如:9 -> 3 -> 7,可以代表整数937。
给定两个这种链表的头节点head1和head2,请生成代表两个整数相加值的结果链表。
例如:链表1为9 -> 3 -> 7,链表2为6 -> 3,最后生成新的结果链表为1 -> 0 -> 0 -> 0。
【基本思路】
容易想到的方法是先将两个链表的值表示出来,然后将两个值累加起来,再根据累加结果生成一个新链表。这种方法实际是不可行的,因为链表的长度可以很长,表示的数字可以很大,容易出现int类型溢出。
**方法一。**利用两个栈,分别将链表1、2的值压入栈中,这样就生成了两个链表的逆序栈。将两个栈同时弹出,这样就相当于两个链表从低位到高位依次弹出,在这个过程中生成相加链表即可。注意相加过程中的进位问题。
#python3.5
def addList1(head1, head2):
if head1 == None or head2 == None:
raise Exception("Input Error!")
s1 = []
s2 = []
while head1 != None:
s1.append(head1.val)
head1 = head1.next
while head2 != None:
s2.append(head2.val)
head2 = head2.next
print("post")
carry = 0
pre = None
while s1 or s2:
num1 = 0 if not s1 else s1.pop()
num2 = 0 if not s2 else s2.pop()
sum = num1 + num2 + carry
node = Node(sum % 10)
node.next = pre
pre = node
carry = sum // 10
if carry == 1:
node = Node(1)
node.next = pre
pre = node
return pre
**方法二。**将链表逆序求解,可以省掉用栈的空间。
def addList2(head1, head2):
if head1 == None or head2 == None:
raise Exception("Input Error!")
head1 = reverseList(head1)
head2 = reverseList(head2)
pre1 = head1
pre2 = head2
pre = None
carry = 0
while pre1 != None or pre2 != None:
x = pre1.val if pre1 else 0
y = pre2.val if pre2 else 0
sum = x + y + carry
node = Node(sum % 10)
node.next = pre
pre = node
carry = sum // 10
pre1 = pre1.next if pre1 else None
pre2 = pre2.next if pre2 else None
if carry == 1:
node = Node(1)
node.next = pre
pre = node
reverseList(head1)
reverseList(head2)
return pre