Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 두 연결 리스트의 교차점

<시간/>

Linked List는 각 노드에 두 개의 블록이 있는 선형 데이터 구조로, 한 블록에는 노드의 값 또는 데이터가 포함되고 다른 블록에는 다음 필드의 주소가 포함됩니다.

각 노드에 목록의 다른 노드를 가리키는 임의의 포인터가 포함된 연결 목록이 있다고 가정해 보겠습니다. 작업은 두 연결 목록이 서로 교차하는 노드를 찾는 것입니다. 교차하지 않으면 NULL을 반환하거나 출력으로 비어 있습니다.

예를 들어

입력-1:

<강한> C++에서 두 연결 리스트의 교차점

출력:

2

설명: 주어진 연결 리스트가 '2' 값을 갖는 노드에서 교차하므로 출력으로 '2' 값을 반환합니다.

입력-2:

<강한> C++에서 두 연결 리스트의 교차점

출력:

NULL

설명: 공통점이 없으므로 이 경우 NULL을 반환합니다.

이 문제를 해결하기 위한 접근 방식

서로 교차하는 공통점이 있는 두 개의 연결 목록이 있습니다. 교차점을 찾기 위해 우리는 두 연결 리스트가 같은 값을 똑같이 가리키고 있다는 것을 찾을 때까지 두 연결 리스트를 탐색할 것입니다. 어느 시점에서 연결 리스트의 다음 노드에 대한 포인터는 동일할 것입니다. 따라서 해당 포인트의 값을 반환합니다.

  • 데이터가 있는 두 개의 연결 목록을 가져오고 다음 노드에 대한 포인터를 가져옵니다.
  • commonPoint(listnode*headA, listnode*headB) 함수는 연결 목록의 두 포인터를 각각 가져와 연결 목록의 공통 또는 교차점 값을 반환합니다.
  • 연결 목록의 길이를 찾는 정수 함수는 목록의 선두에서 두 연결 목록의 길이를 반환합니다.
  • 이제 두 목록의 헤드에 대한 포인터를 만들고 길이가 더 긴 목록을 탐색합니다(첫 번째 목록의 길이 – 두 번째 목록의 길이).
  • 다음 포인터가 같을 때까지 목록을 탐색합니다.
  • 두 목록이 교차하는 특정 노드의 값을 반환합니다.

예시

#include <bits/stdc++.h>
using namespace std;
class listnode {
   public:
      int data;
   listnode * next;
};
// Find the length of the linked list
int count(listnode * head) {
   int count = 0;
   while (head != NULL) {
      count++;
      head = head -> next;
   }
   return count;
}
//Function to get the common point of two linked list
int commonPoint(listnode * headA, listnode * headB) {
   int len1 = count(headA);
   int len2 = count(headB);
   listnode * p1 = headA;
   listnode * p2 = headB;
   if (len1 > len2) {
      for (int i = 0; i < len1 - len2; ++i) {
         p1 = p1 -> next;
      }
   }
   if (len1 < len2) {
      for (int i = 0; i < len2 - len1; ++i) {
         p2 = p2 -> next;
      }
   }
   while (p1 != NULL and p2 != NULL) {
      if (p1 == p2) {
         return p1 -> data;
      }
      p1 = p1 -> next;
      p2 = p2 -> next;
   }
   return -1;
}
int main() {
   listnode * head;
   listnode * headA = new listnode();
   headA -> data = 5;
   listnode * headB = new listnode();
   headB -> data = 4;
   head = new listnode();
   head -> data = 9;
   headB -> next = head;
   head = new listnode();
   head -> data = 2;
   headB -> next -> next = head;
   head = new listnode();
   head -> data = 7;
   headA -> next = head;
   headB -> next -> next -> next = head;
   head = new listnode();
   head -> data = 3;
   headA -> next -> next = head;
   headA -> next -> next -> next = NULL;
   cout << commonPoint(headA, headB) << endl;
}

위의 코드를 실행하면 출력이 다음과 같이 생성됩니다.

출력

7

설명: 주어진 연결 목록은 '7'에서 병합됩니다.

C++에서 두 연결 리스트의 교차점