/**********************************************************************************
*time 2016/08/26 14:37
*Place Ctrip.15#.9F
*author DZQ
**********************************************************************************/
#include<cstdio>
#include<algorithm>
struct Node
{
int value;
Node *next;
};
/*******************************************************
*name get_Length_Of_List 得到一个链表的长度
*parameter Node *sentinel_Node 一个链表的哨兵节点
*return value int 链表的长度
***************************************************************/
int get_Length_Of_List(Node *sentinel_Node);
/*******************************************************************************************************
*name get_Frist_Same_Node 得到两个链表的第一个公共节点
*parameter Node* sentinel_Node1,Node* sentinel_Node2 两个链表的哨兵节点
*return value Node * 第一个公共的节点,如果没有找到返回NULL
***********************************************************************************************************/
Node *get_Frist_Same_Node(Node* sentinel_Node1,Node* sentinel_Node2);
void print_List(Node* sentinel_Node)
{
if(sentinel_Node==NULL||sentinel_Node->next==NULL)
{
return;
}
Node* node=sentinel_Node->next;
while(node!=NULL)
{
printf("%d ",node->value);
node=node->next;
}
printf("\n");
}
Node *get_Frist_Same_Node(Node* sentinel_Node1,Node* sentinel_Node2)
{
if(sentinel_Node1==NULL||sentinel_Node1->next==NULL||sentinel_Node2==NULL||sentinel_Node2->next==NULL)
{
return NULL;
}
int num_Of_List1=get_Length_Of_List(sentinel_Node1);
int num_Of_List2=get_Length_Of_List(sentinel_Node2);
Node* frist_To_Search;//比较长的链表先走
Node* second_To_Search;
int num_Of_Dif;//两个链表的差值
//分出长短
if(num_Of_List1>num_Of_List2)
{
frist_To_Search=sentinel_Node1;
second_To_Search=sentinel_Node2;
num_Of_Dif=num_Of_List1-num_Of_List2;
}
else
{
frist_To_Search=sentinel_Node2;
second_To_Search=sentinel_Node1;
num_Of_Dif=num_Of_List2-num_Of_List1;
}
Node* node1=frist_To_Search->next;
Node* node2=second_To_Search->next;
//比较长的链表先走,使剩下的节点与比较短的节点个数相同
for(int i=0;i<num_Of_Dif;i++)
{
node1=node1->next;
}
while(node1!=node2)
{
node1=node1->next;
node2=node2->next;
}
return node1;
}
int get_Length_Of_List(Node *sentinel_Node)
{
if(sentinel_Node==NULL||sentinel_Node->next==NULL) return 0;
int num_Of_List=0;
Node* node=sentinel_Node->next;
while(node!=NULL)
{
node=node->next;
num_Of_List++;
}
return num_Of_List;
}
int main()
{
//list1
Node* sentinel_Node1=(Node *)malloc(sizeof(Node));
sentinel_Node1->value=-1;
Node* node11=(Node *)malloc(sizeof(Node));
node11->value=1;
sentinel_Node1->next=node11;
Node* node12=(Node *)malloc(sizeof(Node));
node12->value=2;
node11->next=node12;
Node* node13=(Node *)malloc(sizeof(Node));
node13->value=3;
node12->next=node13;
Node* node14=(Node *)malloc(sizeof(Node));
node14->value=4;
node13->next=node14;
Node* node15=(Node *)malloc(sizeof(Node));
node15->value=5;
node14->next=node15;
Node* node16=(Node *)malloc(sizeof(Node));
node16->value=6;
node15->next=node16;
Node* node17=(Node *)malloc(sizeof(Node));
node17->value=7;
node16->next=node17;
Node* node18=(Node *)malloc(sizeof(Node));
node18->value=8;
node17->next=node18;
Node* node19=(Node *)malloc(sizeof(Node));
node19->value=9;
node18->next=node19;
Node* node110=(Node *)malloc(sizeof(Node));
node110->value=10;
node19->next=node110;
node110->next=NULL;
//list2
Node* sentinel_Node2=(Node *)malloc(sizeof(Node));
sentinel_Node2->value=-1;
Node* node21=(Node *)malloc(sizeof(Node));
node21->value=21;
sentinel_Node2->next=node21;
Node* node22=(Node *)malloc(sizeof(Node));
node22->value=22;
node21->next=node22;
node22->next=node13;
Node *frist_Same_Node=get_Frist_Same_Node(sentinel_Node1,sentinel_Node2);
if(frist_Same_Node==NULL)
{
printf("No same node\n");
}
else
{
printf("The frist same node is %d\n",frist_Same_Node->value);
}
return 0;
}
剑指offer37_两个链表的第一个公共节点
最新推荐文章于 2016-09-25 23:35:52 发布