合并两个有序链表
输入两个单调递增的有序链表,输出两个链表合并后的链表,当然合成后的链表满足单调非递减规则
题解:
1)指针法:对链表中的元素,用对两个链表设置两个指针,对有序链表的数据逐个进行比较,较小的数据插入到合并的链表之中。
代码如下:
/*
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)
return pHead2;
if(!pHead2)
return pHead1;
ListNode *p;
ListNode *List;
if(pHead1->val<pHead2->val){
List=pHead1;pHead1=pHead1->next;
}
else{
List=pHead2;pHead2=pHead2->next;
}
p=List;
while(pHead1&&pHead2){
if(pHead1->val<pHead2->val){
p->next=pHead1;
p=p->next;
pHead1=pHead1->next;
}
else{
p->next=pHead2;
p=p->next;
pHead2=pHead2->next;
}
}
while(pHead1){
p->next=pHead1;
p=p->next;
pHead1=pHead1->next;
}
while(pHead2){
p->next=pHead2;
p=p->next;
pHead2=pHead2->next;
}
return List;
}
};
2)递归法:比较两个链表的头指针,将数据较小的数据接在合并链表后,然后将链表递归重新看作两个链表的合并。
即递归的每一次,便将两个链表中,较小的头节点合并进合并链表之中。
代码如下:
/*
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)
return pHead2;
if(!pHead2)
return pHead1;
ListNode *List;
if(pHead1->val<pHead2->val){
List=pHead1;
List->next=Merge(pHead1->next,pHead2);
}
else{
List=pHead2;
List->next=Merge(pHead1,pHead2->next);
}
return List;
}
};