5日目に2つのソートチェーンテーブルをマージ
3703 ワード
テーマ:2つのインクリメンタルソートのチェーンテーブルを入力し、この2つのチェーンテーブルをマージし、新しいチェーンテーブルのノードをインクリメンタルソートします.
テスト例:
2つのチェーンテーブルを入力しても空です
入力された2つのチェーンテーブルのうちの1つが空です
確認する必要があります:チェーンテーブルのデータは空いていますか?
参考資料:
《剣指offer》面接問題17
テスト例:
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