题目:输入两个链表,找出它们的第一个公共结点。
分析:先找出两个链表哪个长,然后让长链表先走几步,之后使两个链表从同一起始地点一起走,互相比较,找到第一个相同结点将其返回。
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int vlaue;
struct node *next;
}node,*pnode;
void create_list1(pnode *head)
{
pnode p,q;
int i;
int a[] = {1,2,3,6,7};
for(i=0;i<5;i++)
{
p = (pnode)malloc(sizeof(node));
p->vlaue = a[i];
p->next = NULL;
if(i == 0)
{
*head = p;
q = p;
}
else
{
q->next = p;
q = p;
}
}
printf("链表1为:\n");
p = *head;
while(p)
{
printf("%d\t",p->vlaue);
p = p->next;
}
printf("\n");
}
void create_list2(pnode *head)
{
pnode p,q;
int i;
int a[] = {4,5,6,7};
for(i=0;i<4;i++)
{
p = (pnode)malloc(sizeof(node));
p->vlaue = a[i];
p->next = NULL;
if(i == 0)
{
*head = p;
q = p;
}
else
{
q->next = p;
q = p;
}
}
printf("链表2为:\n");
p = *head;
while(p)
{
printf("%d\t",p->vlaue);
p = p->next;
}
printf("\n");
}
int get_length(pnode head)
{
if(head==NULL)
return 0;
pnode p = head;
int len = 0;
while(p)
{
++len;
p = p->next;
}
return len;
}
pnode find_common(pnode head1, pnode head2)
{
if(head1==NULL || head2==NULL)
return NULL;
int len1 = get_length(head1);
int len2 = get_length(head2);
int len_dif = len1 - len2;
pnode long_list = head1;
pnode short_list = head2;
pnode common_node;
if(len1 < len2)
{
long_list = head2;
short_list = head1;
len_dif = len2 - len1;
}
int i;
for(i=0;i<len_dif;i++)
long_list = long_list->next;
while(long_list!=NULL && short_list!=NULL && long_list->vlaue!=short_list->vlaue)
//while(long_list!=NULL && short_list!=NULL && long_list!=short_list) 这里本来是这样的,但创建链表的时候偷懒,没有将两个链表的公共部分合在一起,所以不能通过结点地址判断,而只能通过结点值判断
{
long_list = long_list->next;
short_list = short_list->next;
}
common_node = long_list;
return common_node;
}
int main()
{
pnode head1,head2,common_node;
create_list1(&head1);
create_list2(&head2);
common_node = find_common(head1,head2);
printf("公共结点为:%d\n",common_node->vlaue);
return 0;
}