【5】判斷倆個鏈表是否相交

/*================================================================*\ 第7題(鏈表) 微軟亞院之編程ios

判斷倆個鏈表是否相交 給出倆個單向鏈表的頭指針,好比h1,h2,判斷這倆個鏈表是否相交。 爲了簡化問題,咱們假設倆個鏈表均不帶環。編程

問題擴展:spa

1.若是鏈表可能有環列?指針

2.若是須要求出倆個鏈表相交的第一個節點列? \*================================================================*/code

 

#include<iostream>
using namespace std;

typedef struct ListNode{
    int data;
    ListNode *next;
}ListNode,*List;

//判斷倆個鏈表是否相交

int is_cross(ListNode *h1,ListNode *h2){
    if(h1==NULL || h2==NULL){
        return 0;
    }
    ListNode *p1=h1;
    ListNode *p2=h2;
    if(p1==p2){
        return 1;
    }
    p1=p1->next;
    p2=p2->next;
    while(p1!=NULL && p2!=NULL && p1!=h1 && p2!=h2){
        if(p1==p2 && p1!=NULL && p2!=NULL){
            return 1;
        }
        p1=p1->next;
        p2=p2->next;
    }
    return 0;
}
void list_add(ListNode *&h,int value){
    ListNode *tmp=new ListNode();
    tmp->data=value;
    tmp->next=NULL;
    if(h==NULL){
        h=tmp;
    }else{
        ListNode *p=h;
        while(p->next!=NULL){
            p=p->next;
        }
        p->next=tmp;
    }
}
void print_list(ListNode *h){
    ListNode *p=h;
    do{
        cout<<p->data<<",";
        p=p->next;
    }while(p!=NULL && p!=h);
    cout<<endl;
}
int main(){
    ListNode *a=NULL;
    ListNode *b=NULL;
    list_add(a,4);
    list_add(a,3);
    list_add(a,2);
    list_add(b,5);
    list_add(b,6);
    list_add(b,7);
    print_list(a);
    //不相交
    int ret=is_cross(a,b);
    cout<<"ret:"<<ret<<endl;
    //相交
    //a->next->next=b->next->next;
    //帶環
    ListNode *p1=a->next->next;
    p1->next=a;
    print_list(a);
    //print_list(b);
    int ret2=is_cross(a,b);
    cout<<"ret:"<<ret2<<endl;
    
}

補充:編譯器

 typedef 爲一個已有的類型取一個新的名字, typedef type newname;io

#define 是宏命令,在編譯前,由預處理器作替代,如同文本編輯的替代命令,把程序中的全部遇到的詞,所有替代。

#define PINT int* 
就是把全部的詞 PINT 替換成 int * ,替換完畢再編譯。 

typedef int* pint; 是語句,由編譯器在編譯過程當中編譯處理。
int* x; 和
pint x; 的聲明是等價的

typedef int* pint;
long int* x; 聲明是能夠的,但
long pint x; 不能夠。

#define PINT int* 
long int* x; 聲明是能夠的,
long PINT x; 也是能夠的。編譯

相關文章
相關標籤/搜索