今天写了个小程序,作两个已经从小到大排序好的数据的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)