題目描述
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。
時間限制:1秒 空間限制:32768K 熱度指數:276846
本題知識點: 鏈表
方法1:同時比較着遍歷兩個鏈表,生成一個新的合併鏈表,注意後面將沒有遍歷完全的鏈表直接鏈接到新鏈表後方即可。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* p1=pHead1;
ListNode* p2=pHead2;
ListNode* head=NULL;
ListNode* tail=NULL;
if(p1==NULL&&p2==NULL)
return NULL;
if(p1==NULL)
return p2;
if(p2==NULL)
return p1;
if(p1->val>=p2->val){
head=tail=p2;
p2=p2->next;
}
else{
head=tail=p1;
p1=p1->next;
}
while(p1!=NULL&&p2!=NULL){
if(p1->val>=p2->val){
tail->next=p2;
tail=p2;
p2=p2->next;
}
else{
tail->next=p1;
tail=p1;
p1=p1->next;
}
}
if(p1!=NULL){
tail->next=p1;
}
if(p2!=NULL){
tail->next=p2;
}
return head;
}
};
方法2:遞歸方法
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode* p1=pHead1;
ListNode* p2=pHead2;
ListNode* tmp=NULL;
if(p1==NULL&&p2==NULL)
return NULL;
if(p1==NULL)
return p2;
if(p2==NULL)
return p1;
if(p1->val>=p2->val){
tmp=p2;
tmp->next=Merge(p2->next,p1);
}
else{
tmp=p1;
tmp->next=Merge(p1->next,p2);
}
return tmp;
}
};
方法3:將兩個鏈表中的元素放入一個vector容器中,然後將元素進行重排序,再將元素存入一個新的鏈表中。
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
vector<int> v;
ListNode* p1=pHead1;
ListNode* p2=pHead2;
ListNode* tmp=NULL;
ListNode* newList=NULL;
if(p1==NULL&&p2==NULL)
return NULL;
if(p1==NULL)
return p2;
if(p2==NULL)
return p1;
while(p1!=NULL){
v.push_back(p1->val);
p1=p1->next;
}
while(p2!=NULL){
v.push_back(p2->val);
p2=p2->next;
}
sort(v.begin(),v.end(),greater<int>());
//sort(A,A+100,greater<int>());//降序排列
//sort(A,A+100,less<int>());//升序排列
for(int i=0;i<v.size();i++){
tmp=new ListNode(v[i]);
tmp->next=newList;
newList=tmp;
}
return newList;
}
};
參考博客:https://blog.csdn.net/happyjacob/article/details/80603423