이 문제에서는 N개의 요소로 구성된 정렬된 연결 목록이 제공됩니다. 우리의 임무는 정렬된 연결 목록에서 중앙값을 찾는 것입니다. .
정렬된 연결 목록 모든 요소가 특정 순서로 정렬된 간단한 연결 목록입니다. 예 − 4 -> 6 -> 7 -> 9 -> NULL
중앙값 연결 목록의 중간 요소입니다. N이 홀수인 것처럼 찾을 수 있습니다. 중앙값은 (n/2) th 입니다. 요소
N이 짝수인 경우 중앙값은 (n/2) 번째 의 평균입니다. 요소 및 (n/2 + 1) 번째 요소.
문제를 이해하기 위해 예를 들어 보겠습니다.
Input: 2 -> 3 -> 4 -> 6 -> 9 -> NULL Output: 4
솔루션 접근 방식
문제에 대한 간단한 해결책은 연결 목록을 탐색하여 연결 목록의 모든 요소를 계산하는 것입니다.
이제 개수가 홀수이면 연결 목록의 N/2번째 요소까지 연결 목록을 다시 탐색합니다.
개수가 짝수이면 N/2번째 요소와 N/2 + 1번째 요소까지 순회하여 더하고 2로 나눕니다.
대체 접근 방식
문제를 해결하는 또 다른 방법은 두 포인터 탐색을 사용하여 연결 목록을 탐색하고 연결 목록의 요소 수를 찾는 것입니다.
다음은 요소 수를 세지 않고 중앙값을 찾는 알고리즘입니다. 그것들은 조건에 따라 두 개의 포인터 pointer1과 pointer2입니다.
포인터1이 NULL이 아니면 포인터2가 중앙값입니다.
pointer1이 NULL이면 (pointer2의 노드 + pointer2 -> 데이터의 이전)/2.
예시
솔루션 작동을 설명하는 프로그램
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node* next;
};
void findMedianValue(Node* head){
Node* ptr1 = head;
Node* ptr2 = head;
Node* prev = head;
if (head != NULL) {
while (ptr2 != NULL && ptr2->next != NULL) {
ptr2 = ptr2->next->next;
prev = ptr1;
ptr1 = ptr1->next;
}
if (ptr2 != NULL)
cout<<ptr1->data;
else
cout<<float(ptr1->data + prev->data) / 2;
}
}
void pushVal(struct Node** head_ref, int new_data){
Node* new_node = new Node;
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
int main(){
struct Node* head = NULL;
pushVal(&head, 3);
pushVal(&head, 5);
pushVal(&head, 6);
pushVal(&head, 8);
pushVal(&head, 9);
pushVal(&head, 11);
cout<<"The median of the linked list is ";
findMedianValue(head);
return 0;
} 출력
The median of the linked list is 7