1. 程式人生 > >劍指Offer-連結串列-(6)

劍指Offer-連結串列-(6)

知識點/陣列:連結串列

題目描述
輸入兩個連結串列,找出它們的第一個公共結點。

思路:

蠻力法:在第一個連結串列遍歷每個節點,每遍歷到一個節點,就在第二個連結串列上遍歷每個節點。如果在第二個連結串列上有一個節點和第二連結串列上的節點一樣,則說明兩個連結串列在這個節點上重合,於是找到了他們的公共節點。時間複雜度:O(m*n);

觀察如果兩個連結串列有重複的節點,那麼公共節點出現在連結串列的尾部。如果我們從兩個連結串列的尾部開始比較,那麼最後一個相同的節點就是我麼你要找的節點。

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        if(pHead1==null||pHead2==null) {return null;}
        int count1=0;
        ListNode p1= pHead1;
        while(p1!=null){
            p1=p1.next;
            count1++;
        }
        int count2=0;
        ListNode p2= pHead2;
        while(p2!=null){
            p2=p2.next;
            count2++;
        }
        int result=count1-count2;
        if(result>0){
            while(result>0){
                pHead1=pHead1.next;
                result--;
            }
            while(pHead1!=pHead2){
                pHead1=pHead1.next;
                pHead2=pHead2.next;
            }
            return pHead1;
        }
        if(result<=0){
            while(result<0){
                pHead2=pHead2.next;
                result++;
            }
            while(pHead1!=pHead2){
                pHead1=pHead1.next;
                pHead2=pHead2.next;
            }
            return pHead1;
        }
        return null;
    }
}