判斷兩個鍊錶能否合併 一道演算法題

2021-10-08 16:24:51 字數 1111 閱讀 2413

有兩個單向鍊錶(鍊錶長度分別為 m,n),這兩個單向鍊錶有可能在某個元素合併,如下圖所示的這樣,也可能不合併。現在給定兩個鍊錶的頭指標,在不修改鍊錶的情況下,如何快速地判斷這兩個鍊錶是否合併?如果合併,找到合併的元素,也就是圖中的 x 元素。

請用**或(偽)**描述演算法,並給出時間複雜度和空間複雜度

兩個鍊錶,如果發生合併,後面的元素則一定相同。從頭開始,找出兩個鍊錶第一次匹配的位置,依次往後比較,如果全部相同,則認為可以合併。

下面展示一些內聯**片

public class tt 

public static void merge(listtl1,listtl2)else

}/**

** @param l1 長度較短的鍊錶

* @param l2 較長的鍊錶

* @return 長鍊表中開始合併的位置下標

*/public static int mergewhere(listl1,listl2)

/** l2 當前正在匹配位置,游標 */

int p = 0;

/** l2 開始合併的位置下標 */

int r = -1;

for (int i=0;i-1 )

if( l2.get(p).equals(l1.get(i)) )

r = resetposition();

}if( (p = l2.indexof(l1.get(i))) > -1 )

}return r;

}private static int resetposition()

private static listmaxsizelist(listtl1, listtl2)

private static listminsizelist(listtl1, listtl2)

}

如上演算法會以兩個鍊錶為主進行兩次迴圈,時間複雜度 o(n^2)。過程中會用到兩個int變數進行記錄指定,空間複雜度為o(1)。

1\題目來自李智慧型老師

2\懇求指正

演算法題 合併兩個有序的鍊錶

題目 已知有兩個有序的單鏈表,其頭指標分別為head1和head2,實現將這兩個鍊錶合併的函式 node listmerge node head1,node head2 這個演算法很像我們排序演算法中的歸併排序,只能說 很像 因為思想是一樣的,但是這個與歸併排序還是有區別的,區別如下 1.歸併排序是...

演算法題 合併兩個有序的鍊錶

題目 已知有兩個有序的單鏈表,其頭指標分別為head1和head2,實現將這兩個鍊錶合併的函式 node listmerge node head1,node head2 這個演算法很像我們排序演算法中的歸併排序,只能說 很像 因為思想是一樣的,但是這個與歸併排序還是有區別的,區別如下 1.歸併排序是...

演算法題 easy 合併兩個有序鍊錶

大學本科階段就對鍊錶比較頭疼,沒有理解透徹,做題目的時候就比較吃力,鍊錶有很多態別,單鏈表 雙鏈表 迴圈鍊錶和雙向鍊錶等,操作也有很多,插入 刪除和排序等,其實只要理解了節點的資料結構,問題就迎刃而解了。節點由資料和指標 next 構成,在對節點操作的過程中,會有乙個虛擬的指標 並不是節點中的nex...