diff --git a/mm.c b/mm.c
index 85b88af0a1891e4c2aadcbdce6456877f758dce0..c460e195761d449a18baca8e20a93870b873cb7e 100644
--- a/mm.c
+++ b/mm.c
@@ -641,16 +641,32 @@ static void *find_fit(size_t asize)
 		return NULL;
 	}
 
-    /* first fit search */
+    /* Next fit search */
 	void *bp = free_listp;
+	void *bestP = bp;
+	void *first = NULL;
+	short flag = 0;
 	do {
-		if (asize <= GET_SIZE(HDRP(bp))) {
-	    	return bp;
-		}
-		if((bp = GET_NEXT_FREE(bp)) == NULL){
-			return NULL;
+		if (GET_SIZE(HDRP(bp)) >= asize) {
+			if(GET_SIZE(HDRP(bestP)) > GET_SIZE(HDRP(bp))){
+				bestP = bp;
+				flag++;
+			}
+			if(!flag){
+				first = bp;
+				flag = 1;
+			}
+			if(flag == 2){
+				break;
+			}
 		}
+		bp = GET_PREV_FREE(bp);
 	} while(bp != free_listp);
+	if(asize <= GET_SIZE(HDRP(bestP))){
+		return bestP;
+	} else if(first != NULL){
+		return first;
+	}
     return NULL; /* no fit */
 }