判断两个单链表是否相交 输出入口点

额 做这题用了我大半节实验课再加将近一个小时  样例过了 如果有错误 就麻烦路过的大牛指出来 

额 很简单的思想到我这可能就。。。  

我先做了两个链表 然后再做个交点出来 然后再判断再把L1放在L2后面, 形成一个环, 再找一下入口点就可以了

加注释的是我测试的时候写的 忽略就行

PS: 防弹这次歌真好听 jimin jimin jimin 

下面上代码 

/// first create two linklist      put the forth element of L2 as the next of L1
/// the we have a linklist ,相交的。
#include <iostream>

using namespace std;

struct node{
    int data;
    node *next;
};

node *createlist1(){
    node *L1 = new node;
    L1->next = NULL;
    L1->data = 0;
    node *p, *r;
    r = L1;

    for(int i=1; i<=4; i++){
        p = new node;
        p->next = NULL;
        p->data = i;
        r->next = p;
        r = r->next;
    }
    return L1;
}
node *createlist2(){
    node *L2 = new node;
    L2->next = NULL;
    L2->data = 7;
    node *p, *r;
    r = L2;

    for(int i=8; i<=12; i++){
        p = new node;
        p->next = NULL;
        p->data = i;
        r->next = p;
        r = r->next;
    }
    return L2;
}

void traverselist(node *head){
    node *p = head;
    while(p){
        cout << p->data << ' ';
        p = p->next;
    }
}
node *find2(node *L2){///  find the forth in L2
    node *p;       ///   0 1 2 3
    p = L2;        ///   7 8 9 10
    int i=0;
    while(p->next && i<3){
        i++;
        p = p->next;
    }
    return p;/// 10
}
node *find1(node *L){///find the tail of L
    node *p;
    p = L;
    while(p->next){
        p = p->next;
    }
    return p;
}

void put(node *p, node *q){
    q->next = p;
}


node * loop(node *head){
    node *slow = head;
    node *fast = head;
    while(fast && fast->next){
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            break;

    }
    if(fast == NULL || fast->next == NULL)
        return NULL;

    slow = head;///   fast 在相遇点
    while(slow != fast){
        slow = slow->next;
        fast = fast->next;

    }
    return slow;


}

int main()
{
    node *L1 = createlist1();
    node *L2 = createlist2();
    ///traverselist(L1);
    node *q = find2(L2);

    ///cout << q->data << endl;


    node *r1 = find1(L1);
    node *r2 = find1(L2);
    ///cout << r1->data << endl;/// 4
    ///cout << r2->data << endl;/// 12
   /// cout << q->data << endl;/// 10
    put(q,r2);
    put(L1, r1);
    /*r2->next = L1;
    r1->next = q;*/
    /// now we have a linklist which have a loop
    /*if(loop(L2)){ ///   its head is L2
        cout << "YES" << endl;
    }
    else{
        cout << "NO" << endl;
    }*/
    /// cout the entrance point
    node *des = loop(L2);
    cout << des->data << endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值