今天寫了個小程序,作兩個已經從小到大排序好的數據的merge。小程序
要求: listA = (1, 3, 5, 10); listB = (4, 6, 12);listA 和listB都是排序由小到大的列表,元素個數不限。app
寫代碼將listA 按照由小到大的順序合併,不去重。spa
第一輪代碼以下:code
def merge(A, B): if len(A)==0: return B if len(B)==0: return A result = [] for itemA in A: for itemB in B: if itemA < itemB: print itemA, "<", itemB, '--------->insert itemA:', itemA result.append(itemA) else: print itemA, ">", itemB, '--------->insert itemB:', itemB result.append(itemB) return result Alist = [1, 2, 3, 7, 8] Blist = [4, 6] print merge(Alist, Blist)
可想而知,獲得的結果天然是不正確的。 blog
問題呢? 很顯然,break 跳出了循環後,再進入的時候,還會從B的開始查起,這樣有的元素就會屢次被查到,而在insertB的時候,也會丟掉A的循環。最終的數據結果是,A的元素丟失,B的元素屢次被插入。排序
那如何爭取解決問題呢?it
下面這個代碼寫的很繁複,可是實現了基本功能。class
def merge(A, B): if len(A)==0: return B if len(B)==0: return A result = [] lenA = len(A) lenB = len(B) currentAIndex = 0 currentBIndex = 0 for i in range(currentAIndex, lenA): for j in range(currentBIndex, lenB): if A[i] < B[j]: print A[i], "<", B[j], '--------->insert itemA:', A[i] result.append(A[i]) currentAIndex = currentAIndex+ 1 break else: print A[i], ">", B[j], '--------->insert itemB:', B[j] result.append(B[j]) currentBIndex = currentBIndex+ 1 while currentAIndex <lenA: result.append(A[currentAIndex]) currentAIndex = currentAIndex+ 1 while currentBIndex <lenB: result.append(B[currentBIndex]) currentBIndex = currentBIndex+ 1 return result Alist = [1, 7, 8] Blist = [4, 6, 9, 10] print merge(Alist, Blist)