1. 程式人生 > >java實現---判斷兩個連結串列是否相交,若相交,求交點(假設連結串列不帶環)

java實現---判斷兩個連結串列是否相交,若相交,求交點(假設連結串列不帶環)

有兩個單鏈表,判斷它們是否相交,若相交,求交點

第一步判斷兩個連結串列是否相交

  • 如果兩個連結串列相交,那麼它們的最後一個節點肯定是同一個節點,如下圖展示
    在這裡插入圖片描述

  • 我們可以分別遍歷兩個連結串列,直到最後一個節點

  • 當最後兩個是同一個節點時,則說明相交

 public static boolean IsPoint(ListNode first,ListNode head){
        
        ListNode forward = first;
        ListNode backward = head;
        if((first == null)||(head == null)){
            return false;
        }
        while(first != null){
            first = first.next;
        }
        while(head != null){
            head = head.next;
        }
        return first == head;
    }
  • 當返回值為true時,則說明相交

第二步求交點

  • 先求出兩個連結串列的長度
  • 當兩個等長時,則兩個節點同時往後走,當走到同一個時,返回該節點,則為交點
  • 當不等長時,首先求出長度之差diff,然後讓長的連結串列先走diff步,接著,兩個同時走,走到同一個時,返回其中一個節點,則為交點
public class Link{
    public static int Length(ListNode list){  //求兩個連結串列的長度
        int count = 0;
        while(list != null){
            list = list.next;
            count++;
        }
        return count;

    }
    public static ListNode Point(ListNode list1,ListNode list2){
        int len1 = Length(list1);         
        int len2 = Length(list2);
        ListNode longL = list1;
        ListNode shortL = list2;
        int diff = len1 -len2;
        if(len2 > len1){
             longL = list2;
             shortL = list1;
             diff = len2 -len1;
        }                                                //長的連結串列定為longL遍歷    短的shortL遍歷
            while(diff-- != 0){
            longL = longL.next;
        }
        while(true){
            if(longL == shortL){
                return longL;
            }
            longL = longL.next;
            shortL = shortL.next;
        }
    }

  • 測試
//    public static void main(String[] args) {
//        ListNode n1 = new ListNode();
//        ListNode n2 = new ListNode();
//        ListNode n3 = new ListNode();
//        ListNode n4 = new ListNode();
//        n1.data = 2;
//        n2.data = 2;
//        n3.data = 3;
//        n4.data = 4;
//        n1.next = n2;
//        n2.next = n3;
//        n3.next = n4;
//        ListNode n5 = new ListNode();
//        ListNode n6 = new ListNode();
//        ListNode n7 = new ListNode();
//        ListNode n8 = new ListNode();
//        n5.data = 1;
//        n6.data = 2;
//        n7.data = 7;
//        n8.data = 8;
//        n5.next = n6;
//        n6.next = n7;
//        n7.next = n8;
//        
    IsPoint(n1,n5);
//    }
//}