题目要求:
这道题的坑点在于什么是公共节点,所谓两个单链表的公共节点,其实是这两个单链表从某一结点开始指向了同一段剩下的部分。
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
LinkList Link_HeadInsert(LinkList &L,LNode* &R)
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
R=s;
scanf("%d",&x);
}
return L;
}
//对本题的解答
LinkList CommenNode(LinkList L1,LinkList L2)
{
LNode *p=L1,*q=L2;
LinkList L;
while(p->next!=q->next)
{
p=p->next;q=q->next;
}
L=p->next;
return L;
}
//....................................
void DestroyLinkList(LinkList &L)
{
LNode* p;
while(L)
{
p=L;
L=L->next;
free(p);
}
return;
}
int main()
{
LinkList L1,L2,Later;
LNode *R1,*R2,*R3; //R1和R2是两个链表的尾指针
printf("建立第一个单链表的前半部分:\n");
L1=Link_HeadInsert(L1,R1);
printf("建立第二个单链表的前半部分:\n");
L2=Link_HeadInsert(L2,R2);
printf("构建两个链表的公共节点:\n");
Later=Link_HeadInsert(Later,R3);
R3=Later;
Later=Later->next;
free(R3);
R1->next=Later;
R2->next=Later;
printf("输出两个单链表之间的公共节点:\n");
LinkList L3=CommenNode(L1,L2);
while(L3)
{
printf("%d ",L3->data);
L3=L3->next;
}
printf("\n");
R1->next=NULL;
R2->next=NULL;
DestroyLinkList(Later);
DestroyLinkList(L1);
DestroyLinkList(L2);
return 0;
}