1. 题目描述
描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
2. 题目解析
2.1 考察问题
本问题考察的是链表的遍历、比较和插入。
2.2 解决方法
- 循环遍历
分别从两个链表中取一个元素比较,谁小把谁插入;然后再从该链表中取出一个元素,执行上述过程,直到其中一个为空,把另一个链表直接插到最后,结束。 - 递归
每次取出一个小元素,然后合并后边的链表,直到其中一个链表为空,返回另一个链表,结束。
2.3 优化分析
链表的遍历,往往循环可以解决,但是递归方式代码会很简洁,当然也不是那么好理解。思维深度,决定了你的表达简洁度。
3. 代码实现
3.1 循环遍历
class Solution:
def Merge(self, pHead1, pHead2):
if not pHead1:
return pHead2
if not pHead2:
return pHead1
pNew = None
pNewHead = None
while True:
if not pHead1:
pNew.next = pHead2
break
if not pHead2:
pNew.next = pHead1
break
if pHead1.val <= pHead2.val: ### if判断选出较小值
nodeSmall = pHead1
pHead1 = pHead1.next
else:
nodeSmall = pHead2
pHead2 = pHead2.next
if not pNew: ## 执行链表插入,
pNew = nodeSmall ##头部初始化
pNewHead = pNew
else:
pNew.next = nodeSmall ### 后续插入
pNew = pNew.next
pNew.next = None
return pNewHead
3.2 递归实现
class Solution:
def Merge(self, pHead1, pHead2):
if not pHead1:
return pHead2
if not pHead2:
return pHead1
if pHead1.val <= pHead2.val:
pHead1.next = self.Merge(pHead1.next, pHead2)
return pHead1 ### 首次进来,如果pHead1 小,则一定是以pHead1 作为头的,所以最后递归完成返回pHead1
else:
pHead2.next = self.Merge(pHead1, pHead2.next)
return pHead2 ### 同上