- C语言中指针的输出格式为%p。
- linux中如何查看版本和是32位还是64位,uname -a
- C语言中*运算符的优先级和&运算符的优先级相等,自右向左。
4. scanf函数和printf函数
5. 求相交链表的交点,带环相交,不带环相交,单链表
6. 求带环链表的环入口
7. 判断两个单链表是否相交
#include<stdio.h>
struct Node{
int num;
int data;
struct Node* next;
};
typedef struct Node Node;
Node* findCrossNode(Node* head1, Node* head2){
Node *fast1 = head1, *fast2 = head2, *slow1 = head1, *slow2 = head2;
Node *ptr1, *ptr2, *ptr, *hptr;
int hasCir1 = 0, hasCir2 = 0, len1, len2, len;
if(head1 == NULL || head2 == NULL)
return NULL;
while(fast1 && fast1 -> next){
slow1 = slow1 -> next;
fast1 = fast1 -> next -> next;
if(slow1 == fast1){
hasCir1 = 1;
break;
}
}
if(hasCir1){
ptr1 = head1;
while(ptr1 != slow1){
ptr1 = ptr1 -> next;
slow1 = slow1 -> next;
}
}
printf("hasCir1: %d\n", hasCir1);
if(ptr1)
printf("cross1: %d\n", ptr1->num);
while(fast2 && fast2 -> next){
slow2 = slow2 -> next;
fast2 = fast2 -> next -> next;
if(slow2 == fast2){
hasCir2 = 1;
break;
}
}
if(hasCir2){
ptr2 = head2;
while(ptr2 != slow2){
ptr2 = ptr2 -> next;
slow2 = slow2 -> next;
}
}
printf("hasCir2: %d\n", hasCir2);
if(ptr2)
printf("cross2: %d\n", ptr2->num);
if(hasCir1 && hasCir2){
if(ptr1 != ptr2){
return ptr1;//或者返回ptr2
}else{
for(len1 = 1, ptr = head1; ptr != ptr1; ptr = ptr -> next, len1 ++);
for(len2 = 1, ptr = head2; ptr != ptr1; ptr = ptr -> next, len2 ++);
if(len1 >= len2){
for(len = 1, ptr = head1; len <= len1 - len2; ptr = ptr -> next, len ++);
hptr = head2;
while( ptr != hptr){
ptr = ptr -> next;
hptr = hptr -> next;
}
return ptr;
}else if(len1 < len2){
for(len = 1, ptr = head2; len <= len2 - len1; ptr = ptr -> next, len ++);
hptr = head1;
while( ptr != hptr){
ptr = ptr -> next;
hptr = hptr -> next;
}
return ptr;
}
}
}
if(!hasCir1 && !hasCir2){
for(len1 = 0, ptr = head1; ptr != NULL; ptr = ptr -> next, len1 ++);
for(len2 = 0, ptr = head2; ptr != NULL; ptr = ptr -> next, len2 ++);
if(len1 >= len2){
for(len = 1, ptr = head1; len <= len1 - len2; ptr = ptr -> next, len ++);
hptr = head2;
while( ptr != hptr){
ptr = ptr -> next;
hptr = hptr -> next;
}
return ptr;
}else if(len1 < len2){
for(len = 1, ptr = head2; len <= len2 - len1; ptr = ptr -> next, len ++);
hptr = head1;
while( ptr != hptr){
ptr = ptr -> next;
hptr = hptr -> next;
}
return ptr;
}
}
return NULL;
}
int main(){
Node a, b, c, d, e;
a.num = 1;
b.num = 2;
c.num = 3;
d.num = 4;
e.num = 5;
a.next = &b;
b.next = &c;
c.next = &d;
d.next = NULL;
e.next = NULL;
Node *crossNode = findCrossNode(&a, &e);
if(crossNode){
printf("The cross Node is %d\n", crossNode->num);
}else{
printf("The Cross Node is NULL\n");
}
return 0;
}