1. 程式人生 > >java兩個有序連結串列合併

java兩個有序連結串列合併

                                       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())因為在遍歷的時候並沒有改變初始連結串列的結構。所以應該用下表來判斷是否遍歷完。

因為遍歷的是連結串列資料結構,並不是棧或者佇列,並不會為空。