একটি লিঙ্ক করা তালিকা হল একটি রৈখিক ডেটা কাঠামো যেখানে প্রতিটি নোডে দুটি ব্লক থাকে যেমন একটি ব্লকে নোডের মান বা ডেটা থাকে এবং অন্য ব্লকে পরবর্তী ক্ষেত্রের ঠিকানা থাকে৷
আসুন ধরে নিই যে আমাদের একটি লিঙ্কযুক্ত তালিকা রয়েছে যাতে প্রতিটি নোডে একটি র্যান্ডম পয়েন্টার থাকে যা তালিকার অন্যান্য নোডের দিকে নির্দেশ করে। কাজটি হল নোডটি খুঁজে বের করা যেখানে দুটি লিঙ্কযুক্ত তালিকা একে অপরকে ছেদ করে। যদি তারা ছেদ না করে, তাহলে আউটপুট হিসাবে NULL বা খালি ফেরত দিন।
উদাহরণস্বরূপ
ইনপুট-1:
আউটপুট:
2
ব্যাখ্যা: যেহেতু প্রদত্ত লিঙ্কযুক্ত তালিকাটি নোডে ছেদ করে '2' মান দিয়ে, তাই আমরা আউটপুট হিসাবে মান '2' ফেরত দেব।
ইনপুট-2:
আউটপুট:
NULL
ব্যাখ্যা: যেহেতু কোন সাধারণ পয়েন্ট নেই, আমরা এই ক্ষেত্রে NULL ফেরত দেব।
এই সমস্যা সমাধানের পদ্ধতি
আমাদের কাছে একটি সাধারণ বিন্দুর সাথে দুটি লিঙ্কযুক্ত তালিকা রয়েছে যেখানে তারা একে অপরকে ছেদ করে। ছেদ বিন্দু খুঁজে পেতে, আমরা উভয় লিঙ্ক তালিকা অতিক্রম করব যতক্ষণ না আমরা দেখতে পাই যে তারা সমানভাবে একই মান নির্দেশ করছে। কিছু সময়ে, লিঙ্ক করা তালিকার পরবর্তী নোডের পয়েন্টার একই হবে। এইভাবে আমরা সেই পয়েন্টের মান ফেরত দেব।
- ডাটা সহ দুটি লিঙ্ক করা তালিকা নিন এবং পরবর্তী নোডে পয়েন্টার করুন।
- একটি ফাংশন commonPoint(listnode*headA, listnode*headB) যথাক্রমে লিঙ্ক করা তালিকার দুটি পয়েন্টার নেয় এবং লিঙ্ক করা তালিকার সাধারণ বা ছেদ বিন্দুর মান প্রদান করে।
- একটি পূর্ণসংখ্যা ফাংশন যা লিঙ্ক করা তালিকার দৈর্ঘ্য খুঁজে বের করে তা তালিকার প্রধান থেকে উভয় লিঙ্ক করা তালিকার দৈর্ঘ্য ফিরিয়ে দেবে।
- এখন উভয় তালিকার মাথায় একটি পয়েন্টার তৈরি করুন এবং তালিকাটি অতিক্রম করুন যেটি তার দৈর্ঘ্যে বড় (প্রথম তালিকার দৈর্ঘ্য - দ্বিতীয় তালিকার দৈর্ঘ্য)।
- এখন তালিকাটি অতিক্রম করুন যতক্ষণ না আমরা পরবর্তী পয়েন্টারটি সমান না পাই।
- সেই নির্দিষ্ট নোডের মান ফেরত দিন যেখানে উভয় তালিকা ছেদ করে।
উদাহরণ
public class Solution { static listnode headA, headB; static class listnode { int data; listnode next; listnode(int d) { data = d; next = null; } } int count(listnode head) { int c = 0; while (head != null) { c++; head = head.next; } return c; } int commonPoint(listnode headA, listnode headB) { listnode p1 = headA; listnode p2 = headB; int c1 = count(headA); int c2 = count(headB); if (c1 > c2) { for (int i = 0; i < c1 - c2; i++) { if (p1 == null) { return - 1; } p1 = p1.next; } } if (c1 < c2) { for (int i = 0; i < c2 - c1; i++) { if (p2 == null) { return - 1; } p2 = p2.next; } } while (p1 != null && p2 != null) { if (p1.data == p2.data) { return p1.data; } p1 = p1.next; p2 = p2.next; } return - 1; } public static void main(String[] args) { Solution list = new Solution(); list.headA = new listnode(5); list.headA.next = new listnode(4); list.headA.next.next = new listnode(9); list.headA.next.next.next = new listnode(7); list.headA.next.next.next.next = new listnode(1); list.headB = new listnode(6); list.headB.next = new listnode(7); list.headB.next.next = new listnode(1); System.out.println(list.commonPoint(headA, headB)); } }
উপরের কোডটি চালানোর ফলে আউটপুট তৈরি হবে,
আউটপুট
7
ব্যাখ্যা :প্রদত্ত লিঙ্কযুক্ত তালিকাগুলি 7 এ ছেদ করছে।