剑指offer37_两个链表的第一个公共节点

来源:互联网 发布:access导入sql server 编辑:程序博客网 时间:2024/06/05 20:54

/***********************************************************************************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;}


0 0