去重合併兩個有序鍊錶之直接操作和Set集合操作

2022-09-11 07:36:09 字數 3168 閱讀 5250

兩者思路對比:

直接操作:因為傳入的是兩個有序的鍊錶,所以說我就直接以其中乙個鍊錶為基準,與另外乙個鍊錶比較,只將比返回值鍊錶的最後乙個記錄的值大的插入,不將等值的插入,理論時間複雜度為o(n)

set操作:將所有的節點取出放入treeset有序集合中,最後生成乙個鍊錶返回,理論時間複雜度為o(2n)

直接操作步驟示意圖:

以為例先取個返回值鍊錶的表頭,並將該鍊錶作為基準鍊錶,比較第乙個值小的為基準鍊錶,相同就取第乙個

返回值鍊錶:1->null

基準鍊錶:3->5->null

非基準鍊錶:1->2->4->5->5->6->null

繼續下一步後的鍊錶,這一步中,取兩個鍊錶中的小值嘗試插入,但是發現與返回值鍊錶末端值相同就丟棄

返回值鍊錶:1->null

基準鍊錶:3->5->null

非基準鍊錶:2->4->5->5->6->null

繼續下一步後的鍊錶,這一步中,取兩個鍊錶中的小值嘗試插入,但是發現與返回值鍊錶末端值不同就插入

返回值鍊錶:1->2->null

基準鍊錶:3->5->null

非基準鍊錶:4->5->5->6->null

繼續下一步後的鍊錶,這一步中,取兩個鍊錶中的小值嘗試插入,但是發現與返回值鍊錶末端值不同就插入

返回值鍊錶:1->2->3->null

基準鍊錶:5->null

非基準鍊錶:4->5->5->6->null

繼續下一步後的鍊錶,這一步中,取兩個鍊錶中的小值嘗試插入,但是發現與返回值鍊錶末端值不同就插入

返回值鍊錶:1->2->3->4->null

基準鍊錶:5->null

非基準鍊錶:5->5->6->null

繼續下一步後的鍊錶,這一步中,取兩個鍊錶中的小值嘗試插入,但是發現與返回值鍊錶末端值不同就插入

返回值鍊錶:1->2->3->4->5->null

基準鍊錶:null

非基準鍊錶:5->5->6->null

其中乙個鍊錶為null之後直接只遍歷另外乙個鏈,因為要去重,所以要遍歷完,取非基準鍊錶中的乙個值嘗試插入,但是發現與返回值鍊錶末端值相同就丟棄

返回值鍊錶:1->2->3->4->5->null

基準鍊錶:null

非基準鍊錶:5->6->null

取非基準鍊錶中的乙個值嘗試插入,但是發現與返回值鍊錶末端值相同就丟棄

返回值鍊錶:1->2->3->4->5->null

基準鍊錶:null

非基準鍊錶:6->null

取非基準鍊錶中的乙個值嘗試插入,但是發現與返回值鍊錶末端值不同就保留,此時兩個鍊錶都為null則結束

返回值鍊錶:1->2->3->4->5->6null

基準鍊錶:null

非基準鍊錶:null

對於set操作的演算法則不展開

自己寫的比較的演算法:

import j**a.util.*;

public

class

main

for (int i = 0; i < 15000; i++)

arrays.sort(one);

arrays.sort(two);

for (int i = 0; i < one.length; i++)

for (int i = 0; i < two.length; i++)

long start =system.nanotime();

node re =change(headone.next, headtwo.next);

long end =system.nanotime();

system.out.println("直接操作:" + (end - start) + "ns");

start =system.nanotime();

node reset =changeset(headone.next, headtwo.next);

end =system.nanotime();

}private

static

node change(node headone, node headtwo)

if (headone == null

)

//返回首元素較小的頭結點, 先取乙個節點為基準

node rehead = headone.data <= headtwo.data?headone: headtwo;

node p2 = headone.data >= headtwo.data? headtwo: headone; //

另一條鏈

node pre = rehead; //

上乙個節點

node p1 = rehead.next; //

當前鏈while(p1 != null && p2 != null

)

if (p1.data !=pre.data)

else

}else

else}}

node now = p1 != null?p1: p2;

pre.next =now;

while(now!= null

)else

}return

rehead;

}private

static

node changeset(node headone, node headtwo)

while(headtwo != null

) iterator iterator =s.iterator();

while

(iterator.hasnext())

return

re.next;

}}class node implements

comparable

@override

public

intcompareto(object o)

else

if (this.data ==t.data)

else}}

實現**

然後執行的時間截圖:

如有錯誤和不足,望指正

千里之行,始於足下

合併兩個有序鍊錶

鍊錶的題目總是讓我很惆悵。動輒就會runtime error。比如這題,額外用了乙個節點的空間來儲存頭節點。我很不情願多用這個空間,不過貌似不行。貌似不行,實際可行,見附錄。把頭節點提出迴圈 實現類 class solution else if l1 null p next l1 if l2 nul...

合併兩個有序鍊錶

三個指標乙個儲存la鍊錶 乙個儲存lb鍊錶,乙個指向新的鍊錶。鍊錶的插入,兩個指標,乙個是head,乙個指向head後面的鏈,新插入的元素位於head後面。執行該 自己外加上class類。static class node public static void main string args st...

合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4思路 很簡單就是二路歸併的思想,時間複雜度o n definition for singly linked list.struct listno...