考点:单链表、递归
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
1.非递归实现(迭代)
需要新建一个虚拟头节点
如果pHead1->val<pHead2->val,把pHead1给cur->next,pHead1走一步指向下一个结点,同时cur也走下一步下一个结点;
否则,pHead2同样操作。
直到pHead1或pHead2有一个为空,接在cur后面即可。
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
//建一个虚拟头节点
ListNode* head=new ListNode(0);
ListNode* cur=head;
while(pHead1 != NULL && pHead2 != NULL){
if(pHead1->val<pHead2->val){
cur->next=pHead1;
pHead1=pHead1->next;
}
else{
cur->next=pHead2;
pHead2=pHead2->next;
}
cur=cur->next;
}
if(pHead1 != NULL)
cur->next=pHead1;
if(pHead2 != NULL)
cur->next=pHead2;
return head->next;
}
2.递归实现(不需要创建新结点)
递归结束的条件:链表为空,返回pHead1或者pHead2
递归缩小递归空间:下一次递归的参数,如果pHead1的Val比pHead1的Val小,传pHead1->next,phead2不变;否则
pHead1不变,phead2->next
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 ==NULL) return pHead2;
if(pHead2==NULL) return pHead1;
ListNode* MergeHead=NULL;
if(pHead1->val<=pHead2->val){
MergeHead=pHead1;
MergeHead->next=Merge(pHead1->next,pHead2);
}
else
{
MergeHead=pHead2;
MergeHead->next=Merge(pHead1,pHead2->next);
}
return MergeHead;
}
python:
def Merge(self, pHead1, pHead2):
# write code here
MergeHead=None
if pHead1 == None:
return pHead2
if pHead2==None:
return pHead1
if(pHead1.val<=pHead2.val):
MergeHead=pHead1;
MergeHead.next=self.Merge(pHead1.next,pHead2)
else:
MergeHead=pHead2;
MergeHead.next=self.Merge(pHead1,pHead2.next)
return MergeHead