java兩個有序連結串列合併
阿新 • • 發佈:2018-11-13
java兩個有序連結串列合併
今天做了個演算法題,遇到了點問題。和大家分享一下
要求是實現兩個連結串列的合併。這個連結串列可以自己用類實現,也可以用LinkedList。為了方便訪問,我用了後者實現。
看一下程式碼:
package MM; import java.util.LinkedList; public class TestList { public static void main(String[] args) { // TODO Auto-generated method stub LinkedList<Integer> aNode=new LinkedList<Integer>(); LinkedList<Integer> bNode=new LinkedList<Integer>(); LinkedList<Integer> cNode=new LinkedList<Integer>(); aNode.addLast(-11); aNode.addLast(1); aNode.addLast(5); aNode.addLast(10); aNode.addLast(50); aNode.addLast(100); bNode.addLast(-6); bNode.addLast(3); bNode.addLast(12); bNode.addLast(23); bNode.addLast(43); bNode.addLast(53); Integer i=0,j=0; for(;i<aNode.size();) { if(i<aNode.size()&&j<bNode.size()) { if(aNode.get(i)<= bNode.get(j)) { cNode.addLast(aNode.get(i)); i++; } else { cNode.addLast(bNode.get(j)); j++; } } else { break; } } for(;i<aNode.size();i++) { cNode.addLast(aNode.get(i)); } for(;j<bNode.size();) { cNode.addLast(bNode.get(j)); j++; } for(Integer result :cNode) { System.out.println(result); } } }
這個演算法的複雜度是o(n)級。遍歷兩個連結串列中的隨意一個連結串列。然後碰到比這個下標小的就插入到新連結串列中。否則繼續迴圈。
最後有一個連結串列遍歷完,把另一個連結串列的剩餘部分放到新連結串列中就行了。
看下執行結果:
總結:思想可以容易想到,但是要注意一些坑
1:第一個for迴圈的i++要寫在只有當把aNode的值放在cNode裡時候才加一。
2:判斷連結串列為空不能用(!aNode.isEmpty())因為在遍歷的時候並沒有改變初始連結串列的結構。所以應該用下表來判斷是否遍歷完。
因為遍歷的是連結串列資料結構,並不是棧或者佇列,並不會為空。