劍指offer37_兩個鏈表的第一個公共節點

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章