由于公共节点后,链表长度是一定的,所以先把较长链表的指针 指向 与较短表相同节点长度处
然后同时遍历 有则返回指针 没有返回 NULL
int getListLen(LinkedList l) {
//返回链表长度,包含头节点
int cnt=1;
LinkedList p=l->next;
while(p!=NULL) {
cnt++;
p=p->next;
}
return cnt;
}
LinkedList FindCommonNode(LinkedList l1,LinkedList l2) {
LinkedList p1,p2;
p1=l1;//p1作为l1的遍历指针
p2=l2;//p2作为l2的遍历指针
//模块1 指向相同长度
int len1=getListLen(l1);
int len2=getListLen(l2);
int diff=len1-len2;
if(diff>0) {
while(diff-->0) {
p1=p1->next;
}
} else {
while(diff++<0) {
p2=p2->next;
}
}
//模块2 找到common node
while(p1!=p2&&p1!=NULL) {
p1=p1->next;
p2=p2->next;
}
有,返回指针 ,没有 返回 NULL
return p1==NULL?NULL:p1;
}
其他细节部分
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode {
int data;
struct Lnode * next;
} Lnode,* LinkedList;
void CreateListHead(LinkedList &l) {
l=(LinkedList)malloc(sizeof(Lnode));
LinkedList p;
l->next=NULL;
int x=0;
while(x!=9999) {
p=(LinkedList)malloc(sizeof(Lnode));
if(p==NULL) {
printf("asks fail");
break;
}
printf("input data\n");
scanf("%d",&x);
p->data=x;
p->next=l->next;
l->next=p;
}
}
void PrintLinkList(LinkedList l) {
LinkedList p=l->next;
while(p!=NULL) {
printf("%d ",p->data);
p=p->next;
}
}
int getListLen(LinkedList l) {
//返回链表长度,包含头节点
int cnt=1;
LinkedList p=l->next;
while(p!=NULL) {
cnt++;
p=p->next;
}
return cnt;
}
LinkedList FindCommonNode(LinkedList l1,LinkedList l2) {
LinkedList p1,p2;
p1=l1;//p1作为l1的遍历指针
p2=l2;//p2作为l2的遍历指针
//模块1 指向相同长度
int len1=getListLen(l1);
int len2=getListLen(l2);
int diff=len1-len2;
if(diff>0) {
while(diff-->0) {
p1=p1->next;
}
} else {
while(diff++<0) {
p2=p2->next;
}
}
//模块2 找到common node
while(p1!=p2&&p1!=NULL) {
p1=p1->next;
p2=p2->next;
}
有,返回指针 ,没有 返回 NULL
return p1==NULL?NULL:p1;
}
int main() {
LinkedList l1=(LinkedList)malloc(sizeof(Lnode));
LinkedList p=(LinkedList)malloc(sizeof(Lnode));
p->data=23;
LinkedList q=(LinkedList)malloc(sizeof(Lnode));
q->data=24;
LinkedList r=(LinkedList)malloc(sizeof(Lnode));
r->data=25;
l1->next=p;
p->next=q;
q->next=r;
r->next=NULL;
PrintLinkList(l1);
printf("\n");
LinkedList l2=(LinkedList)malloc(sizeof(Lnode));
l2->next=q;
PrintLinkList(l2);
printf("\n");
LinkedList l3=(LinkedList)malloc(sizeof(Lnode));
l3->next=FindCommonNode(l1,l2);
PrintLinkList(l3);
return 0;
}