1. 程式人生 > 其它 >【劍指offer中等部分11】兩個連結串列的第一個公共結點(java)

【劍指offer中等部分11】兩個連結串列的第一個公共結點(java)

技術標籤:有趣的演算法連結串列指標資料結構java面試

一、題目描述

輸入兩個連結串列,找出它們的第一個公共結點。(注意因為傳入資料是連結串列,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的),如下圖,找第一個公共結點,這裡就是c1。
在這裡插入圖片描述

二、分析

我們首先可以想到的方法就是暴力破解,即讓用兩個指標分別指向兩連結串列的表頭,然後讓連結串列2中指標往後移動,看是否有與連結串列1(a1-c3)中指標指向的結點相同的結點。沒有則連結串列1中指標往後移動一位,連結串列2指標由回到表頭,再次往後移動。

2.1 方法一

暴力破解,假設連結串列1長度為m,連結串列2長度為n,時間複雜度為O(mn)

程式碼如下:

public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode temp1 = pHead1;
        ListNode temp2 = pHead2;
        while(temp1 != null){
            while(temp2 !=null){
                if(temp1 == temp2){
                    return temp1;
//找到公共結點 } temp2 = temp2.next; } temp2 = pHead2; temp1 = temp1.next; } return null; //未找到公共結點 } }

在這裡插入圖片描述

2.2 方法二

第二種方法就是利用連結串列結點的數量關係,我們再把開始的圖拿出來,連結串列1(a1-c3)有5個結點,連結串列2(b1-c3)有6個結點,兩個連結串列的結點雖然不一樣多,但是如果讓連結串列1中指標temp1遍歷完後再遍歷連結串列2,連結串列2中指標temp2遍歷完後再遍歷連結串列1,這樣5+6 = 6+5,不就一樣了嘛,雖然連結串列1中結點少,但是兩個連結串列總數相等,即後面一定會重合,指向同一結點。temp1==null表示走到最後了,時間複雜度O(m+n)


在這裡插入圖片描述
程式碼如下:

public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode temp1 = pHead1;
        ListNode temp2 = pHead2;
        while(temp1 != temp2){
            temp1 = (temp1 == null) ? pHead2 : temp1.next;
            temp2 = (temp2 == null) ? pHead1 : temp2.next;
        }
        return temp1;
    }
}

在這裡插入圖片描述