cs
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node* next;
};
int List_length(struct Node* head)
{
int length = 0;
while(head != NULL)
{
length ++;
head = head->next;
}
return length;
}
struct Node* move_pointer(struct Node* head, int count)
{
int i;
for(i = 0; i < count; i ++)
{
head = head->next;
}
return head;
}
struct Node *getIntersectionNode(struct Node* headA, struct Node* headB)
{
int lengthA = List_length(headA);
int lengthB = List_length(headB);
if(lengthA > lengthB){
headA = move_pointer(headA, lengthA - lengthB);
}else{
headB = move_pointer(headB, lengthB - lengthA);
}
struct Node* result = NULL;
while(headA != NULL && headB != NULL)
{
if(headA == headB){
result = headA;
break;
}
headA = headA->next;
headB = headB->next;
}
return result;
}
void freeList(struct Node* head) {
struct Node* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
void Print(struct Node* head)
{
struct Node *temp = head;
while(temp != NULL){
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n");
}
int main()
{
// 创建示例链表
struct Node* headA = (struct Node*)malloc(sizeof(struct Node));
struct Node* headB = (struct Node*)malloc(sizeof(struct Node));
struct Node* intersection = (struct Node*)malloc(sizeof(struct Node));
// 初始化链表A:4 -> 1 -> 8 -> 4 -> 5
headA->data = 4;
headA->next = (struct Node*)malloc(sizeof(struct Node));
headA->next->data = 1;
headA->next->next = intersection;
// 初始化链表B:5 -> 6 -> 1 -> 8 -> 4 ->5
headB->data = 5;
headB->next = (struct Node*)malloc(sizeof(struct Node));
headB->next->data = 6;
headB->next->next = (struct Node*)malloc(sizeof(struct Node));
headB->next->next->data = 1;
headB->next->next->next = intersection;
// 初始化相交节点
intersection->data = 8;
intersection->next = (struct Node*)malloc(sizeof(struct Node));
intersection->next->data = 4;
intersection->next->next = (struct Node*)malloc(sizeof(struct Node));
intersection->next->next->data = 5;
intersection->next->next->next = NULL;
Print(headA);
Print(headB);
// 查找相交节点
struct Node* result = getIntersectionNode(headA, headB);
if (result) {
printf("相交节点的数据为:%d\n", result->data);
} else {
printf("没有相交节点\n");
}
freeList(headA);
freeList(headB); // 释放链表B的内存
freeList(intersection); // 释放相交部分的内存
return 0;
}