23王道,单链表第8题:寻找公共单链表的长度

109 阅读1分钟
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0); cin.tie(0)
#define sd(a) scanf("%d", &a)
#define sc(a) scanf(" %c", &a)
#define sdd(a, b) scanf("%d%d", &a, &b)
#define pd(a) printf("%d\n", a)
#define pll(a) printf("%lld\n", a) 
#define rush() int T; cin >> T; while(T --)
#define dbg(a) cout << #a << ": " << a << endl
#define pb(a) push_back(a) 
#define fi first
#define se second
#define rep(i, a, b) for(int i = (a); i <= (b); i ++)
#define null NULL
using namespace std;
typedef long long ll;
typedef pair<char, char> pcc;
typedef pair<int, int> pii;
const int N = 1e6 + 5;

	int n, m, t;

typedef struct Lnode{
	int data;
	Lnode *nxt;
}*LinkList;

void headInsert (LinkList &L, int n)
{
	L = new Lnode;
	L -> nxt = null;
	for (int i = 1; i <= n; i ++) {
		Lnode *p = new Lnode;
		cin >> p -> data;
		p -> nxt = L -> nxt;
		L -> nxt = p;
	}
}

void tailInsert (LinkList &L, int n)
{
	L = new Lnode;
	L -> nxt = null;
	Lnode *r = L;
	for(int i = 1; i <= n; i ++) {
		Lnode *p = new Lnode;
		cin >> p -> data;
		p -> nxt = null;
		r -> nxt = p;
		r = p;
	}
}

int getlen(LinkList L)
{
	int sz = 0;
	L = L -> nxt;
	while(L) {
		L = L -> nxt;
		sz ++;
	}
	return sz;
}

void insert(LinkList &a, LinkList &b, int x)
{
	Lnode *r = a, *p = b;
	while(r -> nxt != null) { //找到 a 的尾指针
		r = r -> nxt;
	}
	for(int i = 1; i <= x; i ++) { // p 指向 b 的第 x 个元素位置
		p = p -> nxt;
	}
	r -> nxt = p;
}

int getcom(LinkList a, LinkList b)
{
	int la = getlen(a), lb = getlen(b);
	LinkList longlist = a, shortlist = b;
	int delta = la - lb;
	if(delta < 0) {
		delta = -delta;
		longlist = b, shortlist = a;
	}
	for(int i = 1; i <= delta; i ++) {
		longlist = longlist -> nxt;
	}
	int ans = 0;
	while(longlist) {
		if(longlist == shortlist) {
			ans ++;
		}
		longlist = longlist -> nxt;
		shortlist = shortlist -> nxt;
	}
	return ans;
}

void print(Lnode *L)
{
	Lnode *p = L -> nxt;
	while(p) {
		cout << p -> data << " ";
		p = p -> nxt;
	}
	puts("");
}

signed main()
{
	Lnode *a = null, *b = null;
	// headInsert(L, 10);
	tailInsert(a, 6); // 1 2 3 4 5 6
	tailInsert(b, 6); // 10 9 8 7 6 5
	insert(b, a, 5); // 插入 a 的后两个元素,将 b 变为 10 9 8 7 6 5 5 6 
	dbg(getcom(a, b));
	system("pause");
	return 0;
}
	
	// 1 2 3 4 5 6
	// 10 9 8 7 6 5