Computer >> Máy Tính >  >> Lập trình >> Java

Tìm điểm giao nhau của hai danh sách được liên kết trong Java

Danh sách được liên kết là cấu trúc dữ liệu tuyến tính trong đó mỗi nút có hai khối sao cho một khối chứa giá trị hoặc dữ liệu của nút và khối còn lại chứa địa chỉ của trường tiếp theo.

Giả sử rằng chúng ta có một danh sách được liên kết sao cho mỗi nút chứa một con trỏ ngẫu nhiên trỏ đến các nút khác trong danh sách. Nhiệm vụ là tìm nút mà tại đó hai danh sách liên kết giao nhau. Nếu chúng không giao nhau, thì trả về NULL hoặc trống ở dạng đầu ra.

Ví dụ

Đầu vào-1:

Tìm điểm giao nhau của hai danh sách được liên kết trong Java

Đầu ra:

2

Giải thích: Vì danh sách được liên kết đã cho giao nhau tại nút có giá trị ‘2’, chúng tôi sẽ trả về giá trị ‘2’ làm đầu ra.

Đầu vào-2:

Tìm điểm giao nhau của hai danh sách được liên kết trong Java

Đầu ra:

NULL

Giải thích: Vì không có điểm chung, chúng tôi sẽ trả về NULL trong trường hợp này.

Phương pháp tiếp cận để giải quyết vấn đề này

Chúng tôi có hai danh sách được liên kết với một điểm chung là chúng giao nhau. Để tìm giao điểm, chúng tôi sẽ duyệt qua cả hai danh sách được liên kết cho đến khi chúng tôi thấy rằng chúng đều trỏ đến cùng một giá trị. Tại một số điểm, con trỏ đến nút tiếp theo của danh sách liên kết sẽ giống nhau. Do đó, chúng tôi sẽ trả về giá trị của điểm đó.

  • Lấy hai danh sách được liên kết với dữ liệu và con trỏ đến nút tiếp theo.
  • Một hàm commonPoint (listnode * headA, listnode * headB) nhận hai con trỏ của danh sách được liên kết và trả về giá trị của điểm chung hoặc điểm giao của danh sách được liên kết.
  • Một hàm số nguyên tìm độ dài của danh sách được liên kết sẽ trả về độ dài của cả hai danh sách được liên kết từ phần đầu của danh sách.
  • Bây giờ, hãy tạo một con trỏ đến đầu của cả hai danh sách và duyệt qua danh sách có độ dài lớn hơn cho đến (độ dài của danh sách đầu tiên - độ dài của danh sách thứ hai).
  • Bây giờ xem qua danh sách cho đến khi chúng tôi tìm thấy con trỏ tiếp theo bằng nhau.
  • Trả lại giá trị của nút cụ thể nơi cả hai danh sách giao nhau.

Ví dụ

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 &amp;&amp; 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));
   }
}

Chạy đoạn mã trên sẽ tạo ra kết quả là,

Đầu ra

7

Giải thích :Các danh sách được liên kết đã cho đang giao nhau tại 7.

Tìm điểm giao nhau của hai danh sách được liên kết trong Java