假设我们有两个排序的链表,我们必须制作一个链表,该链表包含从起点到终点的最大和路径。最终列表可能包含来自两个输入列表的节点。
在创建结果列表时,我们可能仅针对相交点(列表中具有相同值的两个节点)切换到其他输入列表。我们必须使用恒定量的额外空间来解决它。
因此,如果输入像[6,8,35,95,115,125],[5,8,17,37,95,105,125,135],则输出将为[6,8,17,37,95,115,125,135]
为了解决这个问题,我们将遵循以下步骤-
结果:=无
上一页1:= a,当前1:= a
上一页2:= b,当前2:= b
当current1不等于None或current2不等于None时,执行
current2:= current2的下一个
current1:= current1的下一个
如果res1> res2,则
除此以外,
下一个上一个2:=下一个上一个1
next1的下一个:= previous2的下一个
结果(= res1> res2)时为previous1,否则为previous2
当current1不为null时,执行
res1:= res1 + current1的数据
current1:= current1的下一个
当current2不为null时,执行
res2:= res2 + current2的数据
current2:= current2的下一个
如果current1的数据<current2的数据,则
除此以外,
res1:= res1 + current1的数据
current1:= current1的下一个
res2:= res2 + current2的数据
current2:= current2的下一个
res1:= 0,res2:= 0
当current1和current2不为null并且current1的数据与current2的数据不同时,执行
如果current1为null,则
如果current2为null,则
如果previous1与a相同,previous2与b相同,则
除此以外,
上一页1:=当前1
previous2:=当前2
如果current1不为null,则
如果current2不为null,则
显示结果的内容。
让我们看下面的实现以更好地理解-
class LinkedList(object): def __init__(self, data_set = []): self.head = None if len(data_set) > 0: for item in data_set: self.insert_node(item) class ListNode(object): def __init__(self, d): self.data = d self.next = None def insert_node(self, new_data): new_node = self.ListNode(new_data) new_node.next = self.head self.head = new_node def find_max_sum_list(self, a, b): result = None previous1 = a current1 = a previous2 = b current2 = b while current1 != None or current2 != None: res1 = 0 res2 = 0 while current1 != None and current2 != None and current1.data != current2.data: if current1.data < current2.data: res1 += current1.data current1 = current1.next else: res2 += current2.data current2 = current2.next if current1 == None: while current2 != None: res2 += current2.data current2 = current2.next if current2 == None: while current1 != None: res1 += current1.data current1 = current1.next if previous1 == a and previous2 == b: result = previous1 if (res1 > res2) else previous2 else: if res1 > res2: previous2.next = previous1.next else: previous1.next = previous2.next previous1 = current1 previous2 = current2 if current1 != None: current1 = current1.next if current2 != None: current2 = current2.next while result != None: print(result.data, end = ' ') result = result.next my_list1 = LinkedList([125,115,95,35,8,6]) my_list2 = LinkedList([135,125,105,95,37,17,8,5]) my_list1.find_max_sum_list(my_list1.head, my_list2.head)
[125,115,95,35,8,6], [135,125,105,95,37,17,8,5]
输出结果
6 8 17 37 95 115 125 135