간단하고 최적의 방법으로 두 개의 단일 연결 목록의 교차점을 찾으려면 다음 접근 방식을 사용할 수 있습니다. 핵심 아이디어는 긴 목록의 시작점을 조정하여 두 연결 목록의 끝을 정렬한 다음 두 목록을 동시에 탐색하여 교차점을 찾는 것입니다.
class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; this.next = null; } } public class LinkedList { // Function to get the intersection node of two linked lists public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB == null) { return null; } // Calculate the lengths of both linked lists int lengthA = getLength(headA); int lengthB = getLength(headB); // Align the start of both lists while (lengthA > lengthB) { headA = headA.next; lengthA--; } while (lengthB > lengthA) { headB = headB.next; lengthB--; } // Traverse both lists together to find the intersection while (headA != headB) { headA = headA.next; headB = headB.next; } return headA; // or headB, they are the same at intersection point } // Utility function to calculate the length of a linked list private int getLength(ListNode head) { int length = 0; while (head != null) { length++; head = head.next; } return length; } // Function to print the linked list public void printList(ListNode head) { ListNode temp = head; while (temp != null) { System.out.print(temp.val + " "); temp = temp.next; } System.out.println(); } public static void main(String[] args) { LinkedList list = new LinkedList(); // Create two linked lists // List A: 1 -> 3 -> 5 -> 7 -> 9 -> 11 ListNode headA = new ListNode(1); headA.next = new ListNode(3); headA.next.next = new ListNode(5); headA.next.next.next = new ListNode(7); headA.next.next.next.next = new ListNode(9); headA.next.next.next.next.next = new ListNode(11); // List B: 2 -> 4 -> 9 -> 11 ListNode headB = new ListNode(2); headB.next = new ListNode(4); headB.next.next = headA.next.next.next.next; // 9 headB.next.next.next = headA.next.next.next.next.next; // 11 System.out.println("List A:"); list.printList(headA); System.out.println("List B:"); list.printList(headB); // Find intersection ListNode intersection = list.getIntersectionNode(headA, headB); if (intersection != null) { System.out.println("Intersection at node with value: " + intersection.val); } else { System.out.println("No intersection."); } } }
ListNode 클래스:
getIntersectionNode 메소드:
getLength 메소드:
printList 메소드:
주 메소드:
이 방법은 간단하고 최적이므로 효율적인 방식으로 두 개의 단일 연결 목록의 교차점을 찾을 수 있습니다.
위 내용은 Java에서 간단하고 최적의 방법으로 두 개의 단일 연결 목록의 교차점을 찾는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!