вот код, который суммирует два связанных списка, затем я разобью его, чтобы вы могли принять его часть и использовать их, однако он недостаточно хорошо протестирован, так как я только что написал его сейчас после взлома this сообщение в блоге и внесение в него небольших правок:
class Node
attr_accessor :value, :next
def initialize(value, next_node)
@value = value
@next = next_node
end
end
class LinkedList
include Enumerable
def initialize
@head = nil
end
def add_to_list(value)
return @head = Node.new(value, nil) unless @head
current_node = @head
while current_node.next != nil
current_node = current_node.next
end
current_node.next = Node.new(value, nil)
end
def each
current = @head
while current
yield current.value
current = current.next
end
end
def to_i
self.reduce(""){ |s, l| "#{l}#{s}" }.to_i
end
end
list1 = LinkedList.new
list2 = LinkedList.new
sum = LinkedList.new
list1.add_to_list(2) # => #<Node:0x000055951cb54940 @value=2, @next=nil>
list1.add_to_list(4) # => #<Node:0x000055951cb545f8 @value=4, @next=nil>
list1.add_to_list(3) # => #<Node:0x000055951cb543a0 @value=3, @next=nil>
list2.add_to_list(5) # => #<Node:0x000055951cb54170 @value=5, @next=nil>
list2.add_to_list(6) # => #<Node:0x000055951cb7bf40 @value=6, @next=nil>
list2.add_to_list(4) # => #<Node:0x000055951cb7bd10 @value=4, @next=nil>
result = list1.to_i + list2.to_i # => 807
result.digits.each do |i|
sum.add_to_list(i)
end
puts list1.to_i # => nil
puts list2.to_i # => nil
puts sum.to_i # => nil
# >> 342
# >> 465
# >> 807
в приведенном выше коде следующее определение узла связанного списка:
class Node
attr_accessor :value, :next
def initialize(value, next_node)
@value = value
@next = next_node
end
end
узел имеет value и указатель на узел, который идет после него в связанном списке.
позволяет разбить связанный список, который в этом случае имеет только два метода: первый - add_to_list
:
def add_to_list(value)
return @head = Node.new(value, nil) unless @head
current_node = @head
while current_node.next != nil
current_node = current_node.next
end
current_node.next = Node.new(value, nil)
end
он принимает целое число в качестве значения, а затем создает для него узел в связанном списке.
второй метод - to_i
, который преобразует связанный список backward
в целое число. так что позже мы можем сделать list1.to_i + list2.to_i
, который дает нам сумму двух списков:
def each
current = @head
while current
yield current.value
current = current.next
end
end
def to_i
self.reduce(""){ |s, l| "#{l}#{s}" }.to_i
end
теперь давайте перейдем к коду, который выполняет фактические вычисления:
- вот инициализация
list1, list2, and the sum lists
:
list1 = LinkedList.new
list2 = LinkedList.new
sum = LinkedList.new
list1.add_to_list(2) # => #<Node:0x000055951cb54940 @value=2, @next=nil>
list1.add_to_list(4) # => #<Node:0x000055951cb545f8 @value=4, @next=nil>
list1.add_to_list(3) # => #<Node:0x000055951cb543a0 @value=3, @next=nil>
list2.add_to_list(5) # => #<Node:0x000055951cb54170 @value=5, @next=nil>
list2.add_to_list(6) # => #<Node:0x000055951cb7bf40 @value=6, @next=nil>
list2.add_to_list(4) # => #<Node:0x000055951cb7bd10 @value=4, @next=nil>
- и здесь выполняется фактическая сумма обоих
list1, and list2
:
result = list1.to_i + list2.to_i # => 807
- вот преобразование целочисленного значения
result
в связанный список:
result.digits.each do |i|
sum.add_to_list(i)
end
- и вот содержимое
list1, list2, and sum
переменных, распечатанных:
puts list1.to_i # => nil
puts list2.to_i # => nil
puts sum.to_i # => nil
# >> 342
# >> 465
# >> 807
, поэтому в вашем методе add_two_numbers
проблемы все, что вы хотите, - это преобразовать два связанных списка в целые числа надлежащим образом, затем сложить их сумму, а затем преобразовать полученное целое число в связанный список, который будет возвращен в качестве окончательного решения, и убедитесь, что вы выполнили достаточно тестовых примеров и протестировали угловые случаи .