1. 程式人生 > >連結串列中的公共節點

連結串列中的公共節點

求取兩連結串列中的第一個公共節點。

由於連結串列中的節點都有一個指向下一個節點的指標,當某個節點公共時,意味著該公共節點指向的下一個節點也公共,即第一個公共節點後的所有節點公共。因此,兩條連結串列按公共節點重疊後呈現Y型。

我們可以先計算兩條連結串列的長度差,該長度差就是長連結串列優先要走的步數,之後兩連結串列就一個一個對應比較,直到找到第一個公共節點為止。

具體程式碼如下:

// ConsoleApplication1.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
struct LinkNode{
	int m_key;
	struct LinkNode *next;
};
unsigned int GetListLength(LinkNode* pHead){
	LinkNode *p;
	p = pHead;
	int i = 0;
	if (pHead){
		while (p){
			i++;
			p = p->next;
		}
		return i;
	}
}

LinkNode* FindFirstCommonNode(LinkNode *pHead1, LinkNode *pHead2)
{   
	int lendifference = abs(int(GetListLength(pHead1)-GetListLength(pHead2)));
	LinkNode *p1, *p2;
	p1 = pHead1;
	p2 = pHead2;
	for (int i = 1; i <= lendifference; i++){
		if (GetListLength(pHead1) > GetListLength(pHead2)){
			p1 = p1->next;
		}else{
			p2 = p2->next;
		}
	}
	for (int i = 1; i <= min(GetListLength(pHead1), GetListLength(pHead2));i++){
		if (p1->m_key == p2->m_key)
			return p1;
		p1 = p1->next;
		p2 = p2->next;
	}
	return NULL;
}
LinkNode* createLink(int *a, int n){
	LinkNode *p=NULL;
	LinkNode* head = NULL;
	for (int i = 0; i < n; i++){
		LinkNode *newnode = (LinkNode*)malloc(sizeof(LinkNode));
		if (!newnode){
			cout <<"node create fail" << endl;
			return NULL;
		}
		newnode->m_key = a[i];
		newnode->next = NULL;
		if (!head){
			head = newnode;
			p = head;
		}
		else{
		p->next = newnode;
		p = p->next;
		}
		//cout << i <<p->m_key<< endl;
	}
	return head;
}
int _tmain(int argc, _TCHAR* argv[])
{
	LinkNode *head1,*head2;
	int a[5] = { 1, 2, 3, 6, 7 };
	int b[] = { 4, 5};
	head1=createLink(a, 5);
	head2 = createLink(b, 2);

	LinkNode *p1 = head1;
	LinkNode *p2 = head2;

	//int len = GetListLength(head);
	while (p2->next)
	{
		//cout << p2->m_key << endl;
		p2 = p2->next;
	}
	while (p1->m_key!=6)
	{
		//cout << p1->m_key << endl;
		p1 = p1->next;
	}
	//cout <<len << endl;
	p2->next = p1;
	p1=FindFirstCommonNode(head1, head2);
	cout << p1->m_key <<endl;
	system("pause");
	return 0;
}