两个等节点数链表交错合并:首个Python函数失效原因排查
问题分析与解决
第一个函数的核心bug是在保存原链表的后续节点之前,就修改了原节点的next指针,导致后续遍历完全丢失了原链表的节点引用。
具体问题拆解
看第一个函数的关键代码段:
self.head = node1 self.head.next = node2 # 此处直接修改了node1的next指针,将其指向node2 t1 = node1.next # 此时node1.next已经是node2,t1拿到的是l2的头节点,而非原l1的第二个节点
当你执行self.head.next = node2时,原l1的头节点(3)的next已经被改成了l2的头节点(6),这时候再给t1赋值node1.next,得到的是6而不是原l1的第二个节点2。
后续循环中,t1始终指向l2的节点,完全没机会访问原l1的剩余节点(2、5、8、9),最终导致链表拼接异常,出现你看到的3->6->4这种截断结果。
对比第二个函数的正确逻辑
第二个函数的处理顺序是正确的:先保存原链表的后续节点,再修改头节点的next指针:
self.head=list1.head curr1=list1.head.next # 先把原l1的第二个节点(2)保存到curr1 self.head.next=list2.head # 再修改头节点的next指向l2的头 curr2=list2.head.next # 保存l2的第二个节点
这种顺序避免了原链表节点引用的丢失,后续循环能正常交替拼接两个链表的所有节点。
修复第一个函数的方法
只需调整代码顺序,先保存原链表的后续节点,再修改头节点的next:
def shuffle_merge(self, l1,l2): node1 = l1.head node2 = l2.head if not node1 and not node2: return self.head = node1 # 先保存原链表的后续节点 t1 = node1.next t2 = node2.next # 再修改头节点的next指向l2的头 self.head.next = node2 temp = self.head.next while t1 and t2: temp.next = t1 temp = temp.next t1 = t1.next temp.next = t2 temp = temp.next t2= t2.next
修改后,t1会正确拿到原l1的第二个节点,后续循环就能正常交替拼接两个链表的所有节点。
内容的提问来源于stack exchange,提问作者notsoanonperson
相关产品推荐
相关产品推荐

