这是我已经完成的第一部分:
设A和B为排序数组,其中所有元素都是不同的,B的所有元素都是不同的(尽管元素可以出现在A和B中)。设计一个O(n)算法,该算法生成一个排序数组C,其中包含A和B的所有元素而不重复。例如,如果A = [1,2,5,7]且B = [2,5,10],则C = [1,2,5,7,10]。
但是我仍然坚持使用这个部分来处理列表:
对于A和B是链接列表的情况,解决相同的练习。
我的代码:
Merge(A,B,C)
i=0;
j=0;
k=0;
while (i < A.length && j < B.length)
if (A.content <= B.content)
C.content = A.content
k = k + 1; i = i + 1
答案 0 :(得分:0)
您的算法不完整:它不会告诉A.content > B.content
时该做什么。该方法几乎与用于合并两个已排序集合的众所周知的算法相同,但是当两个项目相等时,您将推进两个集合。
使用链接列表不会更改算法,因为在这两种情况下,您都会对每个集合中的单个“head”元素进行操作。
merge-lists(list a, list b) -> list c
while !a.at-end && !b.at-end
if a.head < b.head
c.add( a.head )
a.move-next
else if a.head > b.head
c.add( b.head )
b.move-next
else // it means that a.head == b.head
c.add( a.head )
a.move-next
b.move-next
end
while !a.at-end
c.add( a.head )
a.move-next
while !b.at-end
c.add( b.head )
b.move-next