链表中的公共节点

来源:互联网 发布:sai软件官方下载 编辑:程序博客网 时间:2024/06/04 23:09

求取两链表中的第一个公共节点。

由于链表中的节点都有一个指向下一个节点的指针,当某个节点公共时,意味着该公共节点指向的下一个节点也公共,即第一个公共节点后的所有节点公共。因此,两条链表按公共节点重叠后呈现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;}


0 0