14,合并两个排序链表《剑指offer》
题目:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:
递归版本:每次只判断当前的两个头结点的大小,执行递归操作,返回较小的头结点;
非递归版本:每次需要循环判断出一个结构:
p1-->p2-->p3 ;
o1-->o2-->o3;
其中
当: p1<o1<o2时 :将p1->next指向o1 然后判断o1和p2 这两个(新的)头结点关系,得到同样的结构;
当:o1<p1<o2时,同样的道理
代码:
//递归版本
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL)return pHead2;
if(pHead2==NULL)return pHead1;
if(pHead1->val<pHead2->val){
pHead1->next=Merge(pHead1->next,pHead2);
return pHead1;
}else{
pHead2->next=Merge(pHead1,pHead2->next);
return pHead2;
}
}
};
//非递归版本:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* tmpNode;
ListNode* newHead;
if(pHead1==NULL) return pHead2;
if(pHead2==NULL) return pHead1;
if(pHead1->val<pHead2->val){
newHead=pHead1;
}else{
newHead=pHead2;
}
while(pHead1!=NULL||pHead2!=NULL){
if(pHead1->val<pHead2->val){
while(pHead1->next!=NULL&&pHead1->next->val<pHead2->val) pHead1=pHead1->next;
if(pHead1->next==NULL){
pHead1->next=pHead2;
break;
}else{
tmpNode=pHead1->next;
pHead1->next=pHead2;
pHead1=tmpNode;
}
}else{
while(pHead2->next!=NULL&&pHead2->next->val<pHead1->val) pHead2=pHead2->next;
if(pHead2->next==NULL){
pHead2->next=pHead1;
break;
}else{
tmpNode=pHead2->next;
pHead2->next=pHead1;
pHead2=tmpNode;
}
}
}
return newHead;
}
};

浙公网安备 33010602011771号