Faits :
A.
Par appel d'offres du 19 février 2021, la Ville de B._ a mis en soumission en procédure ouverte le marché public relatif à l'assainissement des bétons des zones A, B, C, Biostyr et filtres à sable Dynasand et à l'assainissement des bétons I2, E, F Biostyr + Dynasand (MP20).
A._, ainsi que C._ SA, parmi d'autres soumissionnaires, ont déposé une offre dans le délai imparti au 1er avril 2021.
B.
B.a. Par décision du 10 juin 2021, la Ville de B._ a exclu Association A._ de la procédure de soumission aux motifs que son offre était incomplète et qu'elle avait été modifiée sur deux points essentiels du marché.
Le même jour, la Ville de B._ a adjugé le marché à C._ SA. Cette décision n'a pas été communiquée à A._.
B.b. Le 21 juin 2021, A._ a recouru devant la Cour de droit public du Tribunal cantonal de la République et canton de Neuchâtel (ci-après: le Tribunal cantonal) contre la décision prononçant son exclusion. Dans des observations datées du 5 juillet 2021, la Ville de B._ a indiqué qu'elle avait adjugé le marché public par décision du 10 juin 2021. Par décision provisionnelle du 8 juillet 2021, notifiée le lendemain à A._, le Tribunal cantonal a interdit au pouvoir adjudicateur de signer le contrat avec l'adjudicataire. Le Tribunal cantonal a retenu que A._ n'avait pas connaissance de la décision d'adjudication au moment où elle avait recouru contre la décision d'exclusion et que l'effectivité de son recours contre sa mise à l'écart devait être garanti jusqu'à droit connu sur la procédure d'adjudication. Par courrier du 15 juillet 2021, le mandataire de A._, invoquant des vacances du 16 juillet au 8 août 2021, a demandé un délai au 31 août 2021 pour répliquer.
Par arrêt du 27 juillet 2021, le Tribunal cantonal a déclaré irrecevable le recours interjeté par A._. En substance, il a retenu que l'intéressée n'avait pas recouru contre la décision d'adjudication, qui était entrée en force de chose décidée, de sorte qu'elle n'avait plus d'intérêt à demander sa réintégration à la procédure d'adjudication et, partant, à contester son exclusion.
B.c. Par acte du 5 août 2021, A._ a recouru devant le Tribunal cantonal contre la décision d'adjudication du 10 juin 2021, en demandant en outre la restitution du délai de recours.
Par arrêt du 26 août 2021, le Tribunal cantonal a déclaré le recours déposé le 5 août 2021 irrecevable et a rejeté la demande de restitution de délai.
C.
Le 1er septembre 2021, A._ dépose un recours en matière de droit public et un recours constitutionnel subsidiaire devant le Tribunal fédéral à l'encontre de l'arrêt du 27 juillet 2021 du Tribunal cantonal déclarant irrecevable le recours déposé contre la décision l'excluant du marché (cause 2C_603/2021). Elle demande, outre l'effet suspensif, que l'arrêt attaqué et la décision d'exclusion du 10 juin 2021 rendue par la Ville de B._ soient annulés, subsidiairement, si le contrat pour le marché a été signé, que l'illicéité de la décision d'exclusion soit constatée.
Le 1er septembre 2021, la recourante forme également un recours en matière de droit public et un recours constitutionnel subsidiaire à l'encontre de l'arrêt du 26 août 2021 du Tribunal cantonal déclarant irrecevable le recours formé contre la décision d'adjudication (cause 2C_660/2021). Elle demande, outre l'effet suspensif et la jonction de la cause avec l'affaire 2C_603/2021, que l'arrêt attaqué et la décision d'adjudication prononcée le 10 juin 2021 par la Ville de B._ soient annulés, subsidiairement, si le contrat pour le marché a été signé, que l'illicéité de la décision d'adjudication soit constatée.
Par ordonnance du 6 septembre 2021, la Juge présidant la IIe Cour de droit public du Tribunal fédéral a joint les causes 2C_603/2021 et 2C_660/2021.
Par ordonnance du 22 septembre 2021, le Président de la IIe Cour de droit public du Tribunal fédéral a rejeté les requêtes d'effet suspensif.
Le Tribunal cantonal ne se détermine pas. La Ville de B._ conclut à l'irrecevabilité, subsidiairement au rejet des recours. La recourante dépose des observations.
Le 23 novembre 2021, la Ville de B._ a conclu avec C._ SA le contrat objet de l'adjudication contestée.

Considérant en droit :
I. Recevabilité et cognition
1.
Le Tribunal fédéral examine d'office sa compétence (<ref-law>) et contrôle librement la recevabilité des recours qui lui sont soumis (<ref-ruling> consid. 1).
1.1. La recourante forme un recours en matière de droit public et un recours constitutionnel subsidiaire à l'encontre de chacun des deux arrêts attaqués. Le recours constitutionnel subsidiaire n'étant recevable que si la voie du recours ordinaire est exclue (cf. <ref-law>), il convient d'examiner d'abord la recevabilité des recours en matière de droit public.
Le choix de la voie de droit dépend du litige sur le fond, même si la décision attaquée repose exclusivement sur le droit de procédure et prononce, comme en l'espèce, l'irrecevabilité des recours (arrêts 2D_36/2020 du 17 novembre 2020 consid. 1.2; 2C_419/2019 du 7 mai 2019 consid. 4.1 et les références citées), étant précisé que la recourante ne conteste pas devant le Tribunal fédéral l'arrêt du 26 août 2021 en tant qu'il porte sur le rejet de sa demande de restitution de délai.
1.2. A teneur de l'art. 83 let. f LTF dans sa teneur du 1er janvier 2021 (RO 2020 641) applicable en l'espèce (cf. arrêts 2D_27/2020 du 5 novembre 2021 consid. 1.1; 2C_355/2021 du 19 octobre 2021 consid. 1.2.1), dans le domaine des marchés publics, un recours en matière de droit public n'est recevable que si la décision attaquée soulève une question juridique de principe et si la valeur estimée du marché à adjuger n'est pas inférieure à la valeur seuil déterminante visée à l'art. 52 al. 1 de la loi fédérale du 21 juin 2019 sur les marchés publics (LMP; RS 172.056.1) et fixée à l'annexe 4 ch. 2 de cette même loi (cf. <ref-ruling> consid. 1.2; <ref-ruling> consid. 1.1). Il incombe à la partie recourante de démontrer la réalisation de ces deux conditions (cf. <ref-law>; <ref-ruling> consid. 1.2), qui sont cumulatives (cf. <ref-ruling> consid. 1.2; <ref-ruling> consid. 2.1; arrêts 2D_27/2020 du 5 novembre 2021 consid. 1.1; 2D_25/2018 du 2 juillet 2019 consid. 1.1, non publié aux <ref-ruling>). En effet, contrairement à ce que soutient la recourante, la modification de la teneur de l'art. 83 let. f LTF entrée en vigueur le 1er janvier 2021 n'a pas eu pour conséquence de rendre alternatives les deux conditions de recevabilité précitées. Au contraire, l'ajout du mot "ou" entre les deux conditions souligne que si l'une ou l'autre n'est pas réalisée, le recours est irrecevable.
Dans ses écritures, la recourante indique elle-même que la condition de la valeur du marché contenue à l'art. 83 let. f ch. 2 LTF n'est "manifestement" pas remplie, car son offre s'élevait à 1'378'882.05 francs. La position de la recourante peut être suivie. En effet, selon l'<ref-law> et les valeurs fixées par l'annexe 4 ch. 2 de ladite loi, ces valeurs sont fixées pour 2021 à 2 millions de francs pour des travaux de construction pour les procédures ouvertes ou sélectives.
En conséquence, la voie du recours en matière de droit public est fermée, sans qu'il soit nécessaire d'examiner si les recours soulèvent une question juridique de principe.
Partant, les recours en matière de droit public sont irrecevables et la voie du recours constitutionnel subsidiaire est ouverte.
1.3. La recourante, qui a pris part aux procédures devant l'autorité précédente et qui est la destinataire des arrêts attaqués, a un intérêt juridique (<ref-law>) à ce que le Tribunal cantonal entre en matière sur les recours déposés devant lui (arrêt 2C_841/2016 du 25 août 2017 consid. 1.3), cela indépendamment et sans préjudice des motifs d'irrecevabilité retenus par l'autorité précédente qui constituent les objets des contestations devant le Tribunal fédéral (<ref-ruling> consid. 3.1). La qualité pour recourir doit en conséquence lui être reconnue.
1.4. En outre, formés contre des arrêts d'un tribunal supérieur statuant en dernière instance cantonale (art. 86 al. 1 let. d et al. 2 et 114 LTF), les recours constitutionnels subsidiaires ont été déposés en temps utile (art. 100 al. 1, en lien avec l'<ref-law>) et dans les formes prescrites (<ref-law>). Il convient donc d'entrer en matière sous réserve de ce qui suit.
1.5. Dans le cadre d'un recours dirigé contre une décision d'irrecevabilité, le recourant ne peut conclure qu'à l'annulation de la décision attaquée et au renvoi de la cause à l'autorité précédente pour qu'elle entre en matière sur le recours cantonal et statue sur le fond (cf. <ref-ruling> consid. 4). Il s'ensuit que les conclusions de la recourante tendant à ce que le Tribunal fédéral se prononce sur le fond sont irrecevables.
2.
2.1. Le recours constitutionnel subsidiaire ne peut être formé que pour violation des droits constitutionnels (<ref-law>). En vertu de l'<ref-law>, applicable par renvoi de l'<ref-law>, les griefs y relatifs doivent être invoqués et motivés par la partie recourante, à savoir expressément soulevés et exposés de manière claire et détaillée, en précisant en quoi consiste la violation (cf. <ref-ruling> consid. 2.1).
2.2. En l'occurrence, dans son mémoire de recours dans la cause 2C_660/2021, la recourante se plaint que l'autorité précédente aurait commis un déni de justice, sans autre argumentation. Il n'y a pas lieu d'entrer en matière sur ce grief qui ne remplit pas les exigences de motivation de l'<ref-law>.
2.3. Par ailleurs, le Tribunal fédéral statue sur la base des faits établis par l'autorité précédente (<ref-law>). Il peut néanmoins rectifier ou compléter les constatations de cette autorité si les faits ont été constatés en violation d'un droit constitutionnel (<ref-law> cum <ref-law>), ce que la partie recourante doit démontrer d'une manière circonstanciée et précise, conformément aux exigences de motivation posées à l'<ref-law> (par renvoi de l'<ref-law>; cf. supra consid. 2.1).
II. Procédure 2C_660/2021
3.
Il convient d'examiner d'abord le recours dirigé à l'encontre de l'arrêt du 26 août 2021 déclarant irrecevable pour cause de tardiveté le recours interjeté au niveau cantonal par la recourante contre la décision d'adjudication du 10 juin 2021 (cause 2C_660/2021). En effet, dans l'arrêt du 27 juillet 2021, le Tribunal cantonal a prononcé l'irrecevabilité du recours dirigé contre la décision d'exclusion du 10 juin 2021, au motif que la recourante ne disposait pas d'un intérêt actuel au recours, faute d'avoir recouru contre la décision d'adjudication en temps utile (cause 2C_603/2021). Partant, l'issue du recours déposé dans la cause 2C_660/2021 aura des conséquences sur le recours interjeté dans la cause 2C_603/2021.
4.
Dans un grief d'ordre formel, la recourante invoque une violation du droit d'être entendu garanti par l'art. 29 Cst., en particulier du droit à une décision motivée et du droit à participer à l'administration des preuves.
4.1. La jurisprudence a déduit du droit d'être entendu (art. 29 al. 2 Cst.) le devoir pour le juge de motiver sa décision, afin que le justiciable puisse la comprendre, la contester utilement s'il y a lieu et exercer son droit de recours à bon escient. Pour répondre à ces exigences, le juge doit mentionner, au moins brièvement, les motifs qui l'ont guidé et sur lesquels il a fondé sa décision, de manière à ce que l'intéressé puisse se rendre compte de la portée de celle-ci et l'attaquer en connaissance de cause. Il n'a toutefois pas l'obligation d'exposer et de discuter tous les faits, moyens de preuve et griefs invoqués par les parties, mais peut au contraire se limiter à l'examen des questions décisives pour l'issue du litige (<ref-ruling> consid. 3.2.1; <ref-ruling> consid. 4.1).
4.2. En l'occurrence, la recourante reproche au Tribunal cantonal d'avoir retenu que la mention de la décision d'adjudication du 10 juin 2021 par la Ville de B._ dans ses déterminations du 5 juillet 2021 était suffisante pour considérer que cette décision existait, qu'elle était valable et par conséquent qu'elle était correctement motivée. Ce faisant, la recourante perd de vue que le Tribunal cantonal n'a pas statué sur le bien-fondé et la conformité au droit de la décision d'adjudication. L'autorité précédente a prononcé l'irrecevabilité du recours cantonal, après avoir constaté la passivité de la recourante qui, une fois qu'elle avait eu connaissance de l'existence de la décision d'adjudication, n'avait ni entrepris des démarches en vue de connaître la teneur exacte de la décision d'adjudication ni déposé de recours en temps utile. Dans la mesure où la motivation de l'arrêt attaqué permet sans difficulté de comprendre le raisonnement qui a conduit le Tribunal cantonal à rendre son jugement, on ne voit pas en quoi l'arrêt attaqué serait contraire au droit à une décision motivée découlant de l'art. 29 al. 2 Cst.
4.3. Le droit d'être entendu garanti par l'art. 29 al. 2 Cst. comprend également le droit pour l'intéressé de s'exprimer sur les éléments pertinents avant qu'une décision ne soit prise touchant sa situation juridique, d'avoir accès au dossier, de produire des preuves pertinentes, d'obtenir qu'il soit donné suite à ses offres de preuves pertinentes, de participer à l'administration des preuves essentielles ou à tout le moins de s'exprimer sur son résultat, lorsque cela est de nature à influer sur la décision à rendre (<ref-ruling> consid. 4.1; <ref-ruling> consid. 4.1.1; <ref-ruling> consid. 6.3.1 et les arrêts cités).
4.4. En l'espèce, la recourante se plaint que le Tribunal cantonal n'ait que partiellement donné suite à sa demande de production du dossier complet de la procédure d'adjudication en mains de la Ville de B._. Elle considère qu'ainsi l'autorité précédente l'a privée de la possibilité de compléter son argumentation sur le fond. Or, le Tribunal cantonal, qui a jugé que les conditions de recevabilité du recours n'étaient pas réunies, ne devait pas instruire le fond du litige, puisque cela était sans influence sur la décision à rendre. Partant, on ne perçoit pas non plus en quoi l'arrêt attaqué serait contraire à l'art. 29 al. 2 Cst. sur ce point.
4.5. En conséquence, le grief tiré d'une violation du droit d'être entendu est infondé.
5.
Invoquant l'art. 9 Cst., la recourante reproche au Tribunal cantonal une constatation arbitraire des faits.
5.1. Il y a arbitraire (art. 9 Cst.) dans l'établissement des faits ou l'appréciation des preuves si le juge n'a manifestement pas compris le sens et la portée d'un moyen de preuve, s'il a omis, sans raison sérieuse, de tenir compte d'un moyen important propre à modifier la décision attaquée ou encore si, sur la base des éléments recueillis, il a fait des déductions insoutenables (cf. <ref-ruling> consid. 1.3.1; <ref-ruling> consid. 3.6.2).
5.2. En l'espèce, la recourante soutient que le Tribunal cantonal a retenu de manière arbitraire qu'elle avait été informée de l'existence de la décision d'adjudication du 10 juin 2021 lorsqu'elle avait pris connaissance des déterminations de la Ville de B._ le 9 juillet 2021 au plus tard. D'après la recourante, les seules allégations de l'autorité adjudicatrice n'étaient pas suffisantes pour établir l'existence de la décision d'adjudication. On ne saurait suivre le raisonnement de la recourante. En effet, après avoir pris connaissance des déterminations mentionnant la décision d'adjudication, le Tribunal cantonal a immédiatement fait interdiction au pouvoir adjudicateur de signer le contrat avec l'adjudicataire par une décision notifiée à la recourante le 9 juillet 2021 également. Ainsi, l'autorité précédente n'a pas douté de la véracité des informations transmises par l'autorité adjudicatrice au sujet de l'attribution du marché et pouvait considérer que la recourante n'avait pas non plus de motif de se défier des indications données par l'autorité adjudicatrice. La recourante n'explique du reste pas pourquoi elle aurait été légitimée à remettre en cause ces déclarations. Partant, le Tribunal cantonal pouvait sans arbitraire retenir que la recourante avait été informée de l'existence de la décision d'adjudication, le 9 juillet 2021 au plus tard.
5.3. Le grief tiré de l'établissement arbitraire des faits doit partant être écarté. Le Tribunal fédéral statuera donc exclusivement sur la base des faits retenus par le Tribunal cantonal.
6.
La recourante fait valoir que l'arrêt attaqué viole le principe de la bonne foi, consacré aux art. 5 al. 3 et 9 al. 1 Cst.
6.1. Selon la jurisprudence, toute personne concernée par l'issue d'une procédure a l'obligation de se renseigner sur l'existence et le contenu de la décision qui la clôt dès qu'elle peut en soupçonner l'existence, sous peine de se voir opposer l'irrecevabilité d'un éventuel recours dirigée contre elle pour cause de tardiveté (<ref-ruling> consid. 1.3; arrêts 2C_83/2020 du 14 septembre 2020 consid. 4.2; 2C_309/2018 du 10 septembre 2018 consid. 4.1). Il convient à cet égard de s'en tenir aux règles de la bonne foi qui s'appliquent non seulement à l'administration, mais aussi aux justiciables (<ref-ruling> consid. 3a/aa); ainsi, l'intéressé doit agir dans un délai raisonnable dès qu'il a connaissance de quelque manière que ce soit de la décision qu'il entend contester (<ref-ruling> consid. 4c; arrêts 2C_83/2020 du 14 septembre 2020 consid. 4.2; 9C_202/2014 du 11 juillet 2014 consid. 4.2). Attendre passivement est en effet contraire au principe de la bonne foi (<ref-ruling> consid. 1.3; <ref-ruling> consid. 4.2; <ref-ruling> consid. 4a; arrêt 2C_83/2020 du 14 septembre 2020 consid. 4.2 et les références citées). Le Tribunal fédéral n'a pas fixé de critères pour déterminer si l'intéressé a agi dans un délai raisonnable; en principe, il tient compte du délai légal dans lequel le recours aurait dû être formé et de la diligence dont on pouvait s'attendre de la part de l'intéressé en fonction des particularités du cas d'espèce (cf. <ref-ruling> consid. 1.3; <ref-ruling> consid. 4; <ref-ruling> consid. 2; 2C_83/2020 du 14 septembre 2020 consid. 4.3).
6.2. Déterminer ce qu'une personne sait ou ce dont elle est consciente relève de l'établissement des faits (cf. <ref-ruling> consid. 3; <ref-ruling> consid. 3a; arrêt 2C_83/2020 du 14 septembre 2020 consid. 4.2) et les constatations opérées à cet égard par l'instance précédente lient le Tribunal fédéral (<ref-law>).
6.3. En l'occurrence, dans son arrêt, le Tribunal cantonal a constaté sans arbitraire que la recourante savait qu'une décision d'adjudication avait été rendue depuis au plus tard le 9 juillet 2021. Il a également retenu que la recourante avait une connaissance suffisante de la décision d'adjudication pour pouvoir valablement la contester dès cette date. Sur la base de ces constats, dont la recourante ne démontre pas, respectivement ne prétend pas, qu'ils seraient arbitraires (cf. supra consid. 2.3 et 5), le Tribunal cantonal pouvait considérer qu'un recours déposé le 5 août 2021 était tardif, car formé au-delà d'un délai raisonnable. En effet, le délai de recours prévu par le droit cantonal était de 10 jours et n'était pas suspendu par les féries. Or, la recourante a attendu que le Tribunal cantonal prononce l'irrecevabilité de son recours formé contre son exclusion (procédure 2C_603/2021) et lui reproche son inaction pour déposer un recours contre la décision d'adjudication, 27 jours après avoir eu connaissance de celle-ci. Pourtant, par décision provisionnelle du 8 juillet 2021, notifiée le lendemain à la recourante, le Tribunal cantonal a fait interdiction à l'autorité adjudicatrice de conclure le contrat avec l'adjudicataire, afin que l'effectivité du recours déposé par la recourante contre son exclusion soit garantie jusqu'à droit connu sur la procédure d'adjudication. Ainsi, le Tribunal cantonal a attiré l'attention de la recourante sur la nécessité de recourir contre la décision d'adjudication et a pris les mesures nécessaires pour garantir l'effectivité de ses démarches. Malgré cela, la recourante, assistée d'un mandataire professionnel qui ne pouvait ignorer que le recours déposé contre l'exclusion n'avait d'intérêt que si la décision d'adjudication n'était pas définitive et exécutoire, n'a entrepris aucune démarche en vue de contester celle-ci.
6.4. Partant, le Tribunal cantonal n'a pas violé le principe de la bonne foi consacré par les art. 5 al. 3 et 9 al. 1 Cst. en considérant que la recourante avait recouru tardivement contre la décision d'adjudication rendue le 10 juin 2021 par la Ville de B._.
6.5. Il découle de ce qui précède que le recours constitutionnel subsidiaire déposé par la recourante dans la cause 2C_660/2021 doit être rejeté.
III. Procédure 2C_603/2021
7.
Le litige de la procédure 2C_603/2021 a pour objet l'exclusion de la recourante de la procédure d'adjudication. Comme cela ressort de l'arrêt entrepris, la recourante a contesté son exclusion devant le Tribunal cantonal dans le but d'être réintégrée dans la procédure d'adjudication et in fine de se voir adjuger le marché. Le contrat relatif au marché contesté ayant été conclu durant la procédure devant le Tribunal fédéral, la recourante demande dorénavant que l'illicéité de son exclusion soit constatée, afin d'obtenir un dédommagement.
7.1. Le seul moyen pour la recourante d'obtenir des dommages-intérêts est de faire constater l'illicéité de la décision d'adjudication. En droit cantonal et fédéral, un tel constat ne peut être effectué que par une autorité de recours saisie dans le cadre de la procédure de recours initiée contre la décision d'adjudication (cf. art. 18 al. 2 de l'accord intercantonal sur les marchés publics du 25 novembre 1994 [AIMP], art. 46 al. 1 de la loi cantonale neuchâteloise du 23 mars 1999 sur les marchés publics [LCPM; RS/NE 601.72] et <ref-law>; <ref-ruling> consid. 1.2.2 rendu sous l'empire de l'ancienne loi fédérale; ETIENNE POLTIER, Droit des marchés publics, 2014, n° 512; PETER GALLI/ANDRÉ MOSER/ELISABETH LANG/MARC STEINER, Praxis des öffentlichen Beschaffungsrechts, 3e éd. 2013, n°s 1414 et 1419 ss; VINCENT CARRON/JACQUES FOURNIER, La protection juridique dans la passation des marchés publics, 2002, p. 137 s). Ainsi, lorsque le contrat objet du marché public a été conclu, la jurisprudence considère que le soumissionnaire évincé possède encore un intérêt juridique actuel au sens de l'<ref-law> à faire constater l'illicéité de l'adjudication, en vue d'une éventuelle action en dommages-intérêts (cf. arrêts 2D_25/2018 du 2 juillet 2018 consid. 1.2 non publié in <ref-ruling>; 2D_42/2016 du 3 octobre 2017 consid. 1.2 et références citées).
7.2. En l'occurrence, il ressort de ce qui précède (cf. supra consid. 4 à 6) que l'irrecevabilité prononcée par le Tribunal cantonal à l'encontre du recours contestant la décision d'adjudication doit être confirmée. En conséquence, la recourante, alors qu'elle aurait été en mesure d'agir en ce sens, ne peut plus faire constater l'illicéité de la décision d'adjudication qui était seule susceptible d'aboutir au dédommagement qu'elle cherche à obtenir par les procédures qu'elle a initiées. La recourante n'a donc plus d'intérêt juridique à ce qu'il soit statué sur son recours en lien avec son exclusion.
7.3. Partant, le recours constitutionnel subsidiaire déposé par la recourante dans la cause 2C_603/2021 doit être déclaré sans objet (cf. <ref-ruling> consid. 1.3.1 et les références citées; cf. également arrêt 2D_50/2020 du 24 mars 2021 consid. 1.3).
IV. Conclusions et frais
8.
Sur le vu de ce qui précède, les recours en matière de droit public dans les causes 2C_603/2021 et 2C_660/2021 sont irrecevables. Le recours constitutionnel subsidiaire dans la cause 2C_660/2021 est rejeté dans la mesure où il est recevable. Le recours constitutionnel subsidiaire dans la cause 2C_603/2021 est déclaré sans objet.
La recourante, qui succombe, doit supporter les frais judiciaires des causes 2C_603/2021 et 2C_660/2021 (<ref-law>). Il n'y a pas lieu d'allouer des dépens (art. 68 al. 1 et 3 LTF).

Par ces motifs, le Tribunal fédéral prononce :
1.
Les recours en matière de droit public dans les causes 2C_603/2021 et 2C_660/2021 sont irrecevables.
2.
Le recours constitutionnel subsidiaire dans la cause 2C_660/2021 est rejeté dans la mesure où il est recevable.
3.
Le recours constitutionnel subsidiaire dans la cause 2C_603/2021 est sans objet.
4.
Les frais judiciaires des causes 2C_603/2021 et 2C_660/2021, arrêtés à 4'000 francs, sont mis à la charge de la recourante.
5.
Le présent arrêt est communiqué au mandataire de la recourante, au Service juridique de la Ville de B._, à l'intimée, ainsi qu'au Tribunal cantonal de la République et canton de Neuchâtel, Cour de droit public.
Lausanne, le 8 février 2022
Au nom de la IIe Cour de droit public
du Tribunal fédéral suisse
La Présidente : F. Aubry Girardin
Le Greffier : A. Wiedler