ในปัญหานี้ เราได้รับรายการที่เชื่อมโยงที่เรียงลำดับซึ่งประกอบด้วยองค์ประกอบ N งานของเราคือ ค้นหาค่ามัธยฐานในรายการที่เชื่อมโยงที่เรียงลำดับแล้ว .
จัดเรียงรายการเชื่อมโยง เป็นรายการที่เชื่อมโยงอย่างง่ายซึ่งองค์ประกอบทั้งหมดจะถูกจัดเรียงตามลำดับเฉพาะ ตัวอย่าง − 4 -> 6 -> 7 -> 9 -> NULL
ค่ามัธยฐาน เป็นองค์ประกอบกลางของรายการที่เชื่อมโยง หาได้เหมือนกับว่า N เป็นเลขคี่ :ค่ามัธยฐานคือ (n/2) th องค์ประกอบ
ถ้า N เป็นคู่ −s มัธยฐานคือค่าเฉลี่ยของ (n/2) th องค์ประกอบและ (n/2 + 1) th ธาตุ
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
Input: 2 -> 3 -> 4 -> 6 -> 9 -> NULL Output: 4
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาอย่างง่ายคือการนับองค์ประกอบทั้งหมดของรายการที่เชื่อมโยงโดยข้ามผ่านมัน
ตอนนี้ หากการนับเป็นเลขคี่ เราจะสำรวจรายการที่เชื่อมโยงอีกครั้งจนถึงองค์ประกอบ N/2 ของรายการที่เชื่อมโยง
หากการนับเป็นเลขคู่ เราจะสำรวจจนถึงองค์ประกอบที่ N/2 และองค์ประกอบที่ N/2 + 1 บวกเข้าด้วยกันแล้วหารด้วย 2
แนวทางอื่น
อีกแนวทางหนึ่งในการแก้ปัญหาคือการสำรวจรายการที่เชื่อมโยงโดยใช้การข้ามผ่านตัวชี้สองตัวและค้นหาการนับองค์ประกอบของรายการที่เชื่อมโยง
นี่คืออัลกอริทึมในการค้นหาค่ามัธยฐานโดยไม่นับจำนวนองค์ประกอบ พวกมันคือพอยน์เตอร์สองตัวพอยน์เตอร์1 และพอยน์เตอร์2 ตามเงื่อนไขที่เราสามารถมีได้
หากตัวชี้ 1 ไม่ใช่ค่า NULL แสดงว่าตัวชี้ 2 มีค่ามัธยฐาน
ถ้า pointer1 เป็น NULL ดังนั้น (ก่อนหน้าของโหนดของ pointer2 + pointer2 -> data)/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