兩者思路對比:
直接操作:因為傳入的是兩個有序的鍊錶,所以說我就直接以其中乙個鍊錶為基準,與另外乙個鍊錶比較,只將比返回值鍊錶的最後乙個記錄的值大的插入,不將等值的插入,理論時間複雜度為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...