#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE{
int data;
struct NODE *next;
}ListNode;
ListNode* LinkList_Create(int *data,int len)
{
int i;
ListNode *pHead = (ListNode*)malloc(sizeof(ListNode));
ListNode *pCur = NULL;
ListNode *pTail = pHead;
for(i=0; i<len; i++)
{
pCur = (ListNode*)malloc(sizeof(ListNode));
pCur->data = data[i];
pTail->next = pCur;
pTail= pCur;
}
pTail->next = NULL;
return pHead;
}
void ShowNode(ListNode* head) {
ListNode* p = head->next;
for(;p;p = p->next) printf("%d ",p->data);
printf("\n");
}
ListNode* mergeTwoLists1(ListNode* List1,ListNode* List2)
{
ListNode* p,* q,* w,*pc;
pc = p;
q = List1->next;
w = List2->next;
while(q != NULL&&w != NULL)
{
if(q->data < w->data)
{
p->next = q;
q = q->next;
}
else
{
p->next = w;
w = w->next;
}
p = p->next;
}
while(!q)
{
p->next = w;
}
while(!w)
{
p->next = q;
}
return pc;
}
ListNode* Merge( ListNode* L1, ListNode* L2 ) {
ListNode* pa, *pb, *pc, *L;
L = (ListNode*)malloc(sizeof( ListNode)); //申请一个头结点L.
pa = L1->next; //指针pa指向L1的第一个结点。
pb = L2->next; //指针pb指向L2的第一个结点。
pc = L; //指针pc指向上面创立的头结点L.
while ( pa && pb )
{ //当L1和L2链表都没有遍历完成的时候。
if ( pa->data <= pb->data ) { //若pa结点的数据小。
pc->next = pa; //把pa串入L中。
//pc = pa; //pc移向当前最后一个结点pa,这也是尾插。
pa = pa->next; //在L1链表中,更新pa位置。
} else {
pc->next = pb;
//pc = pb;
pb = pb->next;
}
pc = pc->next;
}
/*如果L1未遍历完,将L1全部串入L,如果L2未遍历完,将L2全部串入L*/
// pc->next = pa ? pa : pb;
if(pa != NULL)
{
pc->next = pa;
}
else if(pb != NULL)
{
pc->next = pb;
}
free(L1);
free(L2);
return L;
}
//销毁链表
int DestroyList(ListNode *head)
{
ListNode *p;
if(head==NULL)
return 0;
while(head)
{
p=head->next;
free(head);
head=p;
}
return 1;
}
//清空链表
int ClearList( ListNode *head)
{
ListNode *p,*q;
if(head==NULL)
return 0;
p=head->next;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
head->next=NULL;
return 1;
}
int main()
{
int data1[] = {1,4,5};
int data2[] = {2,3,6};
ListNode* List1 = LinkList_Create(data1,3);
ListNode* List2 = LinkList_Create(data2,3);
ShowNode(List1);
ShowNode(List2);
ListNode *pHead = Merge(List1,List2);
ShowNode(pHead);
DestroyList(pHead);
ShowNode(pHead);
return 0;
}
合并两个有序链表
最新推荐文章于 2024-07-23 19:08:50 发布