Si
- par une modification non autorisée", il a été signifié "vous pouvez changer, mais à la fin, ils devraient être restaurée", et
- nous avons pu parcourir les listes exactement deux fois
l'algorithme suivant serait la solution.
Tout d'abord, les chiffres. Supposons le premier de la liste est de longueur a+c
et le second est de longueur b+c
où c
est la longueur de la "queue" (après la mergepoint). Nous allons désigner comme suit:
x = a+c
y = b+c
Puisque nous ne connaissons pas la longueur, nous allons calculer l' x
et y
sans des itérations supplémentaires; vous verrez comment.
Ensuite, nous itération de chaque liste et pour renverser la vapeur lors de l'itération! Si les deux itérateurs atteindre le point de fusion dans le même temps, alors nous trouver par simple comparaison. Sinon, un pointeur d'atteindre le point de fusion avant l'autre.
Après cela, quand les autres itérateur atteint le point de fusion, il ne procédera pas à la commune de la queue. Au lieu de cela va revenir à l'ancien début de la liste qui avaient atteint la fusion-point avant! Donc, avant qu'il n'atteigne la fin de la modification de la liste (c'est à dire l'ex-début de la liste), il prendra a+b+1
d'itérations total. Appelons - z+1
.
Le pointeur atteint la fusion point d'abord, permet de garder l'itération, jusqu'à atteindre la fin de la liste. Le nombre d'itérations, il doit être calculée et est égale à x
.
Ensuite, ce pointeur itère arrière et annule les listes de nouveau. Mais maintenant, il ne sera pas revenir au début de la liste qu'il a commencé à partir de! Au lieu de cela, il va aller au début de la liste autres! Le nombre d'itérations, il doit être calculé et égale à y
.
Donc, nous savons que l'un des numéros suivants:
x = a+c
y = b+c
z = a+b
À partir de laquelle nous déterminons que
a = (+x-y+z)/2
b = (-x+y+z)/2
c = (+x+y-z)/2
Ce qui résout le problème.