連結串列中的公共節點
阿新 • • 發佈:2019-01-23
求取兩連結串列中的第一個公共節點。
由於連結串列中的節點都有一個指向下一個節點的指標,當某個節點公共時,意味著該公共節點指向的下一個節點也公共,即第一個公共節點後的所有節點公共。因此,兩條連結串列按公共節點重疊後呈現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; }