《剑指offer》面试题12:合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题思路分析:
这两个链表都是单调递增的,合并这两个链表的意思是将这两个链表全部打乱后,再根据从小到大的顺序进行重新指向,最后得到一个新的链表,我们可以直接使用递归的方法来做这个题目,代码如下:
class Solution: # 返回合并后列表 #这个递归的方法简直是无敌啊! def Merge(self, pHead1, pHead2): #判断链表是否存在,如果不存在就返回另外一个链表,另一个链表必定是单调不减的 if not pHead1: return pHead2 if not pHead2: return pHead1 #采用分治的思想? if pHead1.val < pHead2.val: #已经确定了新链表的表头,那么我们只需要后面的链表即可,因此从phead1的第二个元素开始算,重新整合排序 #因为这个函数一定返回的是一个有序的链表的缘故 pHead1.next = self.Merge(pHead1.next, pHead2) return pHead1 else:#pHead1.val > pHead2.val pHead2.next = self.Merge(pHead1, pHead2.next) return pHead2
因为我们Merge函数返回的一定是一个具有从小到大顺序的链表,因此我们拿到一个两组链表当中进行走一次比较之后更小的值,直接采用递归,将更小值所在的链表下一个数值带入进去Merge函数当中进行递归,这样就可以直接得到最后的结果了,这种解法很难想到,但多刷一刷题目慢慢就有经验了。
方法二:
创建一个新的链表,然后将得到的这两个链表当中的每一个值进行比较,让依次在这两个拿到的链表当中比较得到的最小的数放入到这个新的链表当中,这个新的链表用tmp来表示,但是我们已经得到这个新的链表之后,新的链表当中的指针已经指向了这个新链表的末尾,因此在创建这个新链表的同时我们需要引入一个变量pHead来记录新链表tmp表头的地址,最后直接return这个pHead的next下一个就是我们整个从小到大排列的链表了。代码如下所示:
class Solution: def Merge(self, pHead1, pHead2): #方法二:新建一个链表,利用传统的方法将遍历后的链表注入进入这个新链表当中 tmp=ListNode(0) pHead=tmp#首先定义一个临时变量pHead,代表了tmp的指针 while pHead1 and pHead2: if pHead1.val<pHead2.val: tmp.next=pHead1#让tmp具有指向 pHead1=pHead1.next else: tmp.next=pHead2 pHead2=pHead2.next tmp=tmp.next if pHead1==None: tmp.next=pHead2#这里不需要循环,一个地址就可以进行全部的赋值 else: tmp.next=pHead1 return pHead.next