额 做这题用了我大半节实验课再加将近一个小时 样例过了 如果有错误 就麻烦路过的大牛指出来
额 很简单的思想到我这可能就。。。
我先做了两个链表 然后再做个交点出来 然后再判断再把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;
}