王道数据结构2.3.7.二.08 找链表的公共节点

由于公共节点后,链表长度是一定的,所以先把较长链表的指针 指向 与较短表相同节点长度处

然后同时遍历 有则返回指针 没有返回 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值