合并链表
文章目录
//原来有序的两个链表合并之后依然有序
#include <iostream>
using namespace std;
typedef struct ListNode{
int m_nValue;
ListNode* m_pNext;
}ListNode, *List;//必须是一个链表
void Insert(List& pHead,int data){
ListNode* p=new ListNode;
p->m_nValue=data;
p->m_pNext=NULL;
if(pHead==NULL)
pHead=p;
else{
p->m_pNext=pHead;
pHead=p;
}
}
void Print(List& pHead){
if(pHead==NULL)
return ;
ListNode* p=pHead;
while(p){
cout<<p->m_nValue<<" ";
p=p->m_pNext;
}
cout<<endl;
}
List Merge(List& L1, List& L2){
ListNode* p1=L1;
ListNode* p2=L2;
ListNode* pMergeHead=NULL;
if(L1==NULL)
return L2;
else if(L2==NULL)
return L1;
if((p1->m_nValue) > (p2->m_nValue)){
pMergeHead=p1;
pMergeHead->m_pNext=Merge(p1->m_pNext,p2);
}
else{
pMergeHead=p2;
pMergeHead->m_pNext=Merge(p1,p2->m_pNext);
}
return pMergeHead;
}
int main()
{
List L=NULL;
List S=NULL;
Insert(L,1);
Insert(L,2);
Insert(L,3);
Insert(L,4);
Print(L);
Insert(S,2);
Insert(S,3);
Insert(S,4);
Insert(S,5);
Print(S);
List tt=Merge(L,S);
ListNode* p=tt;
while(p){
cout<<p->m_nValue<<" ";
p=p->m_pNext;
}
return 0;
}
//还记得typedef struct and struct的区别吗? 下面的结果也是正确的 理解为ListNode *=List;
#include <iostream>
using namespace std;
struct ListNode{
int m_nValue;
ListNode* m_pNext;
};//必须是一个链表
void Insert(ListNode* &pHead,int data){
ListNode* p=new ListNode;
p->m_nValue=data;
p->m_pNext=NULL;
if(pHead==NULL)
pHead=p;
else{
p->m_pNext=pHead;
pHead=p;
}
}
void Print(ListNode* &pHead){//ListNode* 链表,&pHead不会改变头结点
if(pHead==NULL)
return ;
ListNode* p=pHead;
while(p){
cout<<p->m_nValue<<" ";
p=p->m_pNext;
}
cout<<endl;
}
//ListNode* FindKthTotail(ListNode* pHead, int k){
// if(pHead==NULL||k<=0)//非法输入
// return NULL;
// ListNode* p1=pHead, *p2=pHead;
//
// for(int i=0;i<k-1;i++){
// if(p1->m_pNext!=NULL){
// p1=p1->m_pNext;//第一个指针走k-1步
// }
// else
// return NULL;//长度不够k个节点
// }
//
//
// while(p1->m_pNext!=NULL){
// p2=p2->m_pNext;
// p1=p1->m_pNext;
// }
// return p2;
//}
//ListNode *ReverseList(List &L){
// ListNode* pNode=L;
// List ReverseHead=NULL;
// ListNode* pPre=NULL;//前一个节点
// while(pNode!=NULL){
// ListNode* pNext=pNode->m_pNext;//保存后一个节点,不至于反转时候丢失
//
// if(pNext==NULL)
// ReverseHead=pNode;//就一个节点
// pNode->m_pNext=pPre;//实现反转
// pPre=pNode;
// pNode=pNext;//继续下一对节点的反转
// }
// return ReverseHead;
//}
ListNode *Merge(ListNode *L1, ListNode *L2){
ListNode* p1=L1;
ListNode* p2=L2;
ListNode* pMergeHead=NULL;
if(L1==NULL)
return L2;
else if(L2==NULL)
return L1;
if((p1->m_nValue) > (p2->m_nValue)){
pMergeHead=p1;
pMergeHead->m_pNext=Merge(p1->m_pNext,p2);
}
else{
pMergeHead=p2;
pMergeHead->m_pNext=Merge(p1,p2->m_pNext);
}
return pMergeHead;
}
int main()
{
ListNode *L=NULL;
ListNode *S=NULL;
Insert(L,1);
Insert(L,2);
Insert(L,3);
Insert(L,4);
Print(L);
Insert(S,2);
Insert(S,3);
Insert(S,4);
Insert(S,5);
Print(S);
ListNode* p=Merge(L,S);
// ListNode* p=tt;
while(p){
cout<<p->m_nValue<<" ";
p=p->m_pNext;
}
return 0;
}