5日目に2つのソートチェーンテーブルをマージ

3703 ワード

テーマ:2つのインクリメンタルソートのチェーンテーブルを入力し、この2つのチェーンテーブルをマージし、新しいチェーンテーブルのノードをインクリメンタルソートします.
テスト例:
2つのチェーンテーブルを入力しても空です
入力された2つのチェーンテーブルのうちの1つが空です
確認する必要があります:チェーンテーブルのデータは空いていますか?
/**
 *     17            ,                          。
 *  		
 *  
 *  2014-1-19
 */
public class MergeSortedLists<T extends Comparable<? super T>> {

	private class Node<T> {
		T data;
		Node<T> next;
	}
	
	public Node<T> mergeLists(Node<T> firstHeade, Node<T> secondHeade) {
		boolean firstIsEmpty = firstHeade == null;
		boolean secondIsEmpty = secondHeade == null;
		if (firstIsEmpty && secondIsEmpty) {
			throw new NullPointerException();
		} else if (firstIsEmpty && !secondIsEmpty) {
			return secondHeade;
		} else if (!firstIsEmpty && secondIsEmpty) {
			return firstHeade;
		}
		
		
		Node<T> firstHeadeNode = firstHeade;
		Node<T> secondHeadeNode = secondHeade;
		Node<T> thridHeade = new Node<T>();
		while (firstHeadeNode != null && secondHeadeNode != null) {
			T firstData = firstHeadeNode.data;
			T secondData = secondHeadeNode.data;
			
			int value = firstData.compareTo(secondData);
			if (value == 0) {
				add(thridHeade, firstData);
				add(thridHeade, secondData);
				firstHeadeNode = firstHeadeNode.next;
				secondHeadeNode = secondHeadeNode.next;
			} else if (value > 0) {
				add(thridHeade, secondData);
				secondHeadeNode = secondHeadeNode.next;
			} else if (value < 0) {
				add(thridHeade, firstData);
				firstHeadeNode = firstHeadeNode.next;
			}
		}
		
		if (firstHeadeNode == null && secondHeadeNode != null) {
			Node<T> node = secondHeadeNode;
			while (node != null) {
				add(thridHeade, node.data);
				node = node.next;
			}
		} else if (firstHeadeNode != null && secondHeadeNode == null) {
			Node<T> node = firstHeadeNode;
			while (node != null) {
				add(thridHeade, node.data);
				node = node.next;
			}
		}
		
		return thridHeade;
	}
	
	private Node<T> mFirstHeade = new Node<T>();
	private Node<T> mSecondHeade = new Node<T>();
	
	public Node<T> getFirstHeade() {
		return mFirstHeade;
	}
	
	public Node<T> getSecondHeade() {
		return mSecondHeade;
	}
	
	public void addToFirstList(T data) {
		add(mFirstHeade, data);
	}
	
	public void addToSecondList(T data) {
		add(mSecondHeade, data);
	}
	
	public void printFirstList() {
		print(mFirstHeade);
	}
	
	public void printSecondList() {
		print(mSecondHeade);
	}
	
	public void print(Node<T> headeNode) {
		Node<T> node = headeNode;
		while (node != null) {
			System.out.print(node.data + " ");
			node = node.next;
		}
		System.out.println();
		
	}
	
	private void add(Node<T> headeNode, T data) {
		if (data == null) {
			throw new NullPointerException();
		}
		
		if (headeNode.data != null) {
			Node<T> currentNode = headeNode;
			while (currentNode.next != null) {
				currentNode = currentNode.next;
			}
			Node<T> node = new Node<T>();
			node.data = data;
			currentNode.next = node;
		} else {
			headeNode.data = data;
		}
	}
	

	public static void main(String[] args) {
		MergeSortedLists<Integer> merge = new MergeSortedLists<Integer>();
		merge.addToFirstList(1);
		merge.addToFirstList(3);
		merge.addToFirstList(5);
		merge.addToFirstList(7);
		merge.printFirstList();
		
		merge.addToSecondList(2);
		merge.addToSecondList(4);
		merge.addToSecondList(6);
		merge.addToSecondList(8);
		merge.printSecondList();
		
		merge.print( merge.mergeLists(merge.getFirstHeade(), merge.getSecondHeade()) );
		
	}

}

参考資料:
《剣指offer》面接問題17