问题描述:
假设有两个单链表A和B,不带头节点,且长度一样,示例如下:
A: 1->2->3->4
B: a->b->c->d
请逆转交替合并两个链表,示例结果如下:
4->d->3->c->2->b->1->a
#include <stdio.h>
#include <stdlib.h>
struct Node
{
char c;
struct Node* next;
};
/*
构造链表
head表示链表头,baseChar表示第一个字母,seqNum表示链表元素的个数
*/
void BuildLink(Node*& head, char baseChar, int seqNum)
{
Node* aNode=NULL;
Node* ptrTail=NULL;
for(int i=0; i<seqNum; ++i)
{
aNode=(Node*)malloc(sizeof(Node));
aNode->c=baseChar+i;
aNode->next=NULL;
if(head==NULL) head=aNode;
if(ptrTail==NULL) ptrTail=aNode;
else
{
ptrTail->next=aNode;
ptrTail=aNode;
}
}
}
//打印链表
void PrintLink(Node* head)
{
Node* ptrNode=head;
while(ptrNode)
{
if(ptrNode->next==NULL)
printf("%c\n", ptrNode->c);
else
printf("%c-->", ptrNode->c);
ptrNode=ptrNode->next;
}
}
//按照题意合并链表A和B
Node* reverse_merge(Node* A, Node* B)
{
Node* ptrCurrentA=A;
Node* ptrCurrentB=B;
Node *ptrNextA=NULL, *ptrNextB=NULL;
Node* ptrPreviousA=NULL;
while(ptrCurrentA!=NULL && ptrCurrentB!=NULL)
{
ptrNextA=ptrCurrentA->next;
ptrNextB=ptrCurrentB->next;
ptrCurrentA->next=ptrCurrentB;
ptrCurrentB->next=ptrPreviousA;
if(ptrNextA==NULL || ptrNextB==NULL)
break;
ptrPreviousA=ptrCurrentA;
ptrCurrentA=ptrNextA;
ptrCurrentB=ptrNextB;
}
return ptrCurrentA;
}
//最后调用此函数,防止内存泄露
void ReleaseLink(Node* head)
{
Node* ptrNode=head;
while(ptrNode!=NULL)
{
head=head->next;
free(ptrNode);
ptrNode=head;
}
}
int main(int argc, char** argv)
{
Node* A=NULL, *B=NULL;
BuildLink(A, '1', 4); //构造链表1->2->3->4
BuildLink(B, 'a', 4); //构造链表a->b->c->d
PrintLink(A);//打印链表A
PrintLink(B);//打印链表B
Node* result=reverse_merge(A, B); //合并链表A和B
PrintLink(result);//打印链表合并结果
ReleaseLink(result); //释放掉链表,防止内存泄露
return 0;
}