private Node merge(Node startLeft, int leftLength, Node startRight, int rightLength) {
		int leftCounter = 0;
		Node leftCursor = startLeft;
		
		int rightCounter = 0;
		Node rightCursor = startRight;
		
		Node startCursor = null;
		Node mergeCursor = null;
		int totalLength = leftLength + rightLength;
		
		for (int i = 0; i < totalLength; i++) {
			if (leftCounter < leftLength && (rightCounter >= rightLength || leftCursor.data.compareTo(rightCursor.data) <= 0)) {
				if (startCursor == null){
					mergeCursor = leftCursor;
					startCursor = mergeCursor;
				}
				else {
					mergeCursor.next = leftCursor;
					mergeCursor = leftCursor;
				}
				leftCursor = leftCursor.next;
				leftCounter++;
			}
			else {
				if (startCursor == null) {
					mergeCursor = rightCursor;
					startCursor = mergeCursor;
				}
				else {
					mergeCursor.next = rightCursor;
					mergeCursor = rightCursor;
				}
				rightCursor = rightCursor.next;
				rightCounter++;
			}
		}
		
		mergeCursor.next = null; // unlink the last node to avoid cycles
		return startCursor;
	}