Faits :
A.
A.a. Le 15 janvier 2016, la commune de U._ (ci-après: la Commune) a publié un appel d'offres selon la procédure ouverte portant sur les prestations de ramassage et de transport des déchets urbains combustibles d'un volume d'environ 1'000 tonnes par an, répartis dans 81 conteneurs de 5 m3, enterrés ou semi-enterrés. L'appel d'offres contenait un cahier des charges techniques (ci-après: le cahier des charges), ainsi que différents formulaires à remplir par les soumissionnaires. Le dossier d'appel d'offres remis aux candidats fixait trois critères d'adjudication: le prix (pondéré à 50 %), les expériences, références et moyens à disposition (pondéré à 40 %) et la gestion des processus et développement durable (pondéré à 10 %). Selon le cahier des charges, les conteneurs enterrés possédaient "un système de levage Kinshofer" et les conteneurs semi-enterrés "un système de levage par boucle simple" (cahier des charges, p. 5; cf. <ref-law>). Les dispositions techniques relatives aux véhicules utilisés prévoyaient ce qui suit (cahier des charges, p. 8; cf. <ref-law>) :
" Les véhicules utilisés seront de type Euro 6 et devront respecter au moins les critères suivants:
[...]
- système de levage des conteneurs 5 m3, semi-enterrés (boucle simple) et enterrés (Kinshofer)
[...]".
A.b. Trois soumissionnaires ont présenté une offre: A._ SA, B._ SA et C._ Sàrl. L'ouverture des offres a eu lieu le 29 février 2016. Par décision du 16 mars 2016, la Commune a attribué le marché à B._ SA, qui avait obtenu, après pondération, 481,50 points. A._ SA s'est placée en deuxième position, avec un total de 406,27 points. Le troisième concurrent a obtenu 333,10 points.
A.c. Le 31 mars 2016, A._ SA a recouru contre cette décision auprès de la Cour de droit public du Tribunal cantonal neuchâtelois (ci-après: le Tribunal cantonal), en soutenant notamment que son offre était plus avantageuse que celle de l'adjudicataire et que cette dernière ne disposait pas de l'équipement nécessaire pour réaliser le mandat prévu par l'appel d'offres. Par arrêt du 5 octobre 2016, le Tribunal cantonal a rejeté le recours.
A.d. Le 21 octobre 2016, A._ SA a recouru contre cet arrêt devant le Tribunal fédéral. En parallèle, le 7 février 2017, elle a déposé auprès du Tribunal cantonal une demande de révision dudit arrêt.
Par ordonnance du 25 novembre 2016, le Président de la IIe Cour de droit public du Tribunal fédéral a rejeté la requête d'effet suspensif formulée par A._ SA dans son recours du 21 octobre 2016.
A.e. Par arrêt du 20 février 2017 (cause 2C_983/2016), le Tribunal fédéral a admis le recours formé par A._ SA contre l'arrêt du 5 octobre 2016. La Cour de céans a retenu que le Tribunal cantonal avait violé le droit d'être entendue de la recourante à deux reprises. En premier lieu, l'autorité précédente n'avait pas indiqué les motifs pour lesquels elle avait rejeté une demande d'expertise, formulée par A._ SA, portant sur la question de l'équipement dont disposait l'adjudicataire. En second lieu, le Tribunal cantonal n'avait pas exposé les raisons qui l'avaient conduit à rejeter l'argumentation de A._ SA consistant à dire que l'adjudicataire ne bénéficiait pas de l'équipement nécessaire pour exécuter le mandat; il n'avait pas non plus indiqué en quoi les deux pièces déposées par la recourante à l'appui de son grief n'étaient pas convaincantes. Le Tribunal fédéral a ainsi annulé l'arrêt rendu le 5 octobre 2016 par le Tribunal cantonal et renvoyé la cause à cette autorité pour nouvelle décision dans le sens des considérants.
B.
Reprenant l'instruction de la cause à la suite de l'arrêt du Tribunal fédéral du 20 février 2017, le Tribunal cantonal a adressé aux entreprises D._ AG et E._ SA, entendues comme témoins par écrit, des questionnaires visant en substance à déterminer si l'équipement proposé par l'adjudicataire permettait d'exécuter le mandat litigieux. Les réponses fournies par ces entreprises ont été transmises aux parties, qui ont pu se déterminer par écrit sur celles-ci.
Le 23 février 2018, le Tribunal cantonal s'est prononcé à nouveau sur le recours formé par A._ SA le 31 mars 2016 (cf. supra let. A.c). Cette autorité, après avoir déclaré irrecevable la demande de révision du 7 février 2017, constatant qu'elle était dirigée contre un arrêt annulé ultérieurement par le Tribunal fédéral, a rejeté le recours. Les juges cantonaux ont retenu que B._ SA était à même d'assurer la correcte exécution du marché et que les notes attribuées aux soumissionnaires ne prêtaient pas le flanc à la critique.
C.
Agissant par la voie du recours constitutionnel subsidiaire auprès du Tribunal fédéral, A._ SA (ci-après: la recourante) demande en substance à cette autorité, sous suite de frais et dépens, d'annuler l'arrêt du 23 février 2018 et de constater l'illicéité de l'adjudication intervenue le 16 mars 2016. Subsidiairement, elle conclut à ce que le marché lui soit attribué. Plus subsidiairement encore, A._ SA requiert le renvoi de la cause au Tribunal cantonal pour instruction complémentaire et nouvelle décision au sens des considérants. Elle se plaint d'arbitraire et de violation de son droit d'être entendue.
Le Tribunal cantonal se réfère à l'arrêt attaqué et propose le rejet du recours. La Commune et B._ SA déposent des observations et concluent au rejet du recours. La recourante a répliqué.
A une date indéterminée, la Commune et B._ SA ont signé le contrat relatif au marché litigieux.

Considérant en droit :
1.
Le Tribunal fédéral examine d'office sa compétence (<ref-law>) et contrôle librement la recevabilité des recours portés devant lui (<ref-ruling> consid. 2 p. 59).
1.1. La présente cause relève du droit public (<ref-law>). Dans le domaine des marchés publics, un recours en matière de droit public n'est recevable, en vertu de l'art. 83 let. f LTF, qu'à la double condition que la valeur du mandat à attribuer soit supérieure ou égale aux seuils déterminants prévus à cet effet et que la décision attaquée soulève une question juridique de principe (<ref-ruling> consid. 1.2 p. 116 s.; <ref-ruling> consid. 1.1 p. 288 s.). Il incombe à la partie recourante de démontrer la réalisation de ces deux conditions (cf. <ref-law>; <ref-ruling> consid. 1.2 p. 117), qui sont cumulatives (arrêt 2C_384/2016 du 6 mars 2017 consid. 1.2, non publié in <ref-ruling>), à moins que la question de principe s'impose avec évidence (<ref-ruling> consid. 1.2 p. 361; <ref-ruling> consid. 1.4.1 p. 119).
Dès lors que la recourante ne soutient ni n'explique que l'arrêt querellé soulèverait une question juridique de principe et qu'une telle question n'apparaît pas d'emblée clairement, c'est à bon droit qu'elle a interjeté un recours constitutionnel subsidiaire (cf. arrêt 2D_42/2016 du 3 octobre 2017 consid. 1.1).
1.2. En sa qualité de partie à la procédure cantonale et d'entreprise soumissionnaire évincée, positionnée au deuxième rang dans le cadre d'une procédure ouverte d'adjudication, la recourante dispose de la qualité pour recourir au sens de l'<ref-law>, notamment d'un intérêt juridique. En particulier, même si, à la suite du rejet par le Tribunal fédéral de la requête d'effet suspensif présentée par l'intéressée (cf. supra let. A.d), la Commune a déjà conclu le contrat relatif au marché en cause avec l'adjudicataire, la recourante possède encore un intérêt actuel à faire constater l'illicéité de l'adjudication, en vue d'une éventuelle action en dommages-intérêts (cf. <ref-ruling> consid. 1.3.2 p. 361; <ref-ruling> consid. 1.2.2 p. 317; arrêt 2D_42/2016 du 3 octobre 2017 consid. 1.2 et les nombreuses références citées).
1.3. Aux dires de la recourante, le recours aurait été déposé dans une boîte postale le 12 avril 2018, soit le dernier jour du délai, compte tenu des féries (art. 117, 46 al. 1 let. a et 100 al. 1 LTF). A l'appui de cette affirmation, l'intéressée a transmis au Tribunal fédéral un document, signé par un agent de sécurité, attestant que le mémoire de recours avait été déposé dans une boîte aux lettres de la Poste suisse le 12 avril 2018 à 22h40. Le même jour, la recourante a en outre transmis le recours au Tribunal fédéral par télécopie.
Dans ces circonstances, on peut admettre que la recourante est en mesure de prouver que son envoi a été expédié à temps, de sorte que le recours est recevable sous cet angle (cf. arrêts 2D_73/2015 du 30 juin 2016 consid. 1.3 et 1B_488/2011 du 2 décembre 2011 consid. 1.2).
1.4. Pour le surplus, interjeté dans les formes prévues par la loi (<ref-law>), le recours est dirigé contre une décision finale (<ref-law>) rendue en dernière instance cantonale par une autorité judiciaire supérieure (art. 114 et 86 al. 1 let. d et al. 2 LTF). Il est donc recevable.
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 le recourant, à 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.2 p. 232). Celui-ci ne peut donc se borner à critiquer la décision attaquée comme il le ferait en instance d'appel, où l'autorité de recours jouit d'une libre cognition; il ne peut, en particulier, se contenter d'opposer sa thèse à celle de l'autorité cantonale, mais doit remettre en cause les considérants de la décision attaquée sous des aspects relevant des droits constitutionnels (arrêts 2D_35/2017 du 5 avril 2018 consid. 2.1 et 2D_42/2016 du 3 octobre 2017 consid. 2.1).
2.2. 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 le recourant 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. consid. 2.1 ci-dessus).
3.
Invoquant l'interdiction de l'arbitraire, la recourante soutient, en substance, que B._ SA aurait dû être exclue de la procédure d'adjudication à cause de son inaptitude à exécuter le marché (recours, p. 9). En effet, au moment où la décision d'adjudication avait été prise, cette société n'était pas en possession de l'équipement nécessaire à exécuter le mandat. En particulier, elle ne disposait pas d'une "pince de type Kinshofer 920" (ci-après: la pince Kinshofer) permettant à ses véhicules de procéder à la vidange des conteneurs à ordures faisant l'objet du marché.
3.1. Une décision est arbitraire (art. 9 Cst.) lorsqu'elle contredit clairement la situation de fait, qu'elle viole gravement une norme ou un principe juridique clair et indiscuté ou qu'elle heurte d'une manière choquante le sentiment de la justice et de l'équité. Il n'y a pas arbitraire du seul fait qu'une solution autre que celle de l'autorité cantonale semble concevable, voire préférable. Pour qu'une décision soit annulée pour cause d'arbitraire, il ne suffit pas que sa motivation soit insoutenable; il faut encore que cette décision soit arbitraire dans son résultat (<ref-ruling> consid. 4.1 p. 566; <ref-ruling> consid. 6.1 p. 205).
3.2. Il n'est pas contesté que, pour pouvoir lever les conteneurs à ordures enterrés et semi enterrés présents sur le territoire de la Commune, l'adjudicataire devait impérativement disposer de la pince Kinshofer précitée (ou d'un système équivalent) (cf. également la réponse de B._ SA, p. 8).
Il est également établi que ladite pince n'a été acquise par B._ SA qu'après la décision d'adjudication du 16 mars 2016. En effet, il ressort de l'arrêt attaqué que, le 12 avril 2016, cette entreprise avait affirmé qu'elle allait devoir "acquérir une pince Kinshofer KM 920 à monter sur sa grue FASSI M 40" et qu'elle aurait rempli les conditions techniques exigées par l'appel d'offres "après acquisition de la pince précitée" (arrêt attaqué, p. 3).
3.3. Selon la jurisprudence, les critères d'aptitude ou de qualification (" Eignungskriterien ") sont des exigences qui subordonnent l'accès à la procédure. Ces critères servent à s'assurer que le soumissionnaire a les capacités suffisantes pour réaliser le marché (cf. <ref-ruling> consid. 7.1 p. 369; <ref-ruling> consid. 5.1 p. 293 s.). Les entreprises soumissionnaires qui ne les remplissent pas voient leur offre exclue d'emblée (<ref-ruling> consid. 7.1 p. 369; arrêt 2C_58/2018 du 29 juin 2018 consid. 5.3). Cette conclusion s'impose toutefois uniquement lorsque le vice n'est pas anodin; le motif d'exclusion doit revêtir une certaine gravité (" ein Ausschlussgrund muss eine gewisse Schwere aufweisen ", <ref-ruling> consid. 2.3.1 p. 182; cf. arrêts 2C_665/2015 du 26 janvier 2016 consid. 1.3.3 et 2C_346/2013 du 20 janvier 2014 consid. 3.3). Lorsque les manquements du soumissionnaire aux exigences d'aptitude ne sont que légers, il serait en effet disproportionné de l'exclure de la procédure d'adjudication (arrêt 2C_58/2018 du 29 juin 2018 consid. 5.3; cf. <ref-ruling> consid. 2.3.1 p. 181 s.). Les critères d'aptitude doivent pouvoir être contrôlés par l'adjudicateur avant la décision d'adjudication, ce qui exclut notamment que des éléments essentiels pour l'exécution du mandat ne soient acquis par l'adjudicataire que par la suite (cf. <ref-ruling> consid. 2.3.2 p. 182 s.). Si l'adjudicateur estime qu'il suffit, pour des raisons pratiques liées à la réalité du marché, que les soumissionnaires se limitent à fournir des garanties, au moment de la décision d'adjudication, qu'ils posséderont les éléments essentiels pour l'exécution du mandat lorsque celui-ci devra être exécuté (ce qui peut se produire s'agissant d'attestations bancaires destinées à prouver la capacité financière des soumissionnaires, cf. <ref-ruling> consid. 7.2 p. 369), alors il doit le mentionner dans l'appel d'offres. S'il ne le fait pas et si une telle volonté ne peut être clairement déduite d'une interprétation de l'appel d'offres (cf. arrêt 2C_111/2018 du 2 juillet 2019 consid. 3.3.4), il ne peut, par la suite, attribuer le marché à une entreprise ne remplissant pas un critère d'aptitude au moment de la décision d'adjudication, sous peine de fausser l'attribution du marché. En effet, il n'est pas exclu que d'autres entreprises concurrentes, désireuses de participer au marché mais n'étant pas en mesure de remplir tous les critères d'aptitude au moment de soumissionner, y aient renoncé compte tenu de la teneur de l'appel d'offres (cf. <ref-ruling> consid. 7.3 in fine p. 370).
A titre d'exemple, dans l'<ref-ruling> (également cité par la recourante), l'entreprise qui s'était vu attribuer le marché ne disposait pas, au moment du dépôt de l'offre, de la licence d'entreprise de transport routier exigée par la législation fédérale. Le Tribunal fédéral, après avoir constaté qu'il s'agissait d'une condition impérative pour pouvoir pratiquer le transport de marchandises par route et donc d'une qualification technique essentielle à l'exécution du mandat, a retenu que le défaut de la licence en question était un vice grave qui aurait dû conduire à l'exclusion du marché de l'entreprise concernée (<ref-ruling> consid. 2.3 p. 181 ss).
3.4. En l'espèce, la pince Kinshofer était un élément essentiel à l'exécution du mandat, car sans cette pièce l'adjudicataire n'aurait pas été à mesure de procéder à la vidange des conteneurs à ordures faisant l'objet du marché (cf. supra consid. 3.2 in initio). Or, l'intéressée n'a acquis la pince en question qu'après la décision d'adjudication (cf. supra consid. 3.2 in fine) et ne disposait donc pas de celle-ci au moment du dépôt de son offre. Dans ces circonstances, conformément à ce qui vient d'être exposé (cf. supra consid. 3.3), ce défaut d'équipement constituait un manquement grave au point d'imposer l'exclusion du marché de cette entreprise. En considérant que celle-ci était à même d'assurer la correcte exécution du marché et en confirmant pour cette raison la décision d'adjudication du 16 mars 2016, le Tribunal cantonal est donc tombé dans l'arbitraire.
Le recours devant être admis pour cette raison, il n'y a pas lieu d'examiner les autres griefs soulevés par la recourante.
4.
Les considérants qui précèdent conduisent à l'admission du recours et à l'annulation de l'arrêt entrepris. Il est constaté que la décision d'adjudication du 16 mars 2016 de la Commune de U._ était illicite.
Compte tenu de l'issue du litige, les frais seront mis pour moitié à la charge de la Commune de U._, qui succombe et dont l'intérêt patrimonial est en cause (<ref-law>; cf. arrêts 2C_861/2017 du 12 octobre 2018 consid. 4 et 2C_498/2017 du 5 octobre 2017 consid. 5.2), et pour l'autre moitié à la charge de B._SA (<ref-law>), solidairement entre elles (<ref-law>). La recourante, qui a obtenu gain de cause avec l'aide d'un mandataire professionnel, a droit à des dépens, qu'il convient de mettre pour moitié à la charge de la Commune de U._, et pour l'autre moitié à celle de B._ SA, solidairement entre elles (<ref-law>). L'affaire sera également renvoyée au Tribunal cantonal pour qu'il statue à nouveau sur les frais et dépens de la procédure qui s'est déroulée devant lui (art. 67 et 68 al. 5 LTF).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est admis et l'arrêt attaqué est annulé.
2.
Il est constaté que la décision d'adjudication du 16 mars 2016 de la Commune de U._ était illicite.
3.
Les frais judiciaires, arrêtés à 2'500 fr., sont mis pour moitié à la charge de la Commune de U._ et pour l'autre moitié à celle de B._ SA, solidairement entre elles.
4.
Une indemnité de 3'000 fr., à payer à la recourante à titre de dépens, est mise pour moitié à la charge de la Commune de U._ et pour l'autre moitié à celle de B._ SA, solidairement entre elles.
5.
La cause est renvoyée au Tribunal cantonal du canton du Neuchâtel afin qu'il statue à nouveau sur le sort des frais et dépens de la procédure accomplie devant lui.
6.
Le présent arrêt est communiqué aux mandataires de la recourante et de B._ SA, à la Commune de U._, ainsi qu'au Tribunal cantonal de la République et canton de Neuchâtel, Cour de droit public.
Lausanne, le 2 juillet 2019
Au nom de la IIe Cour de droit public
du Tribunal fédéral suisse
Le Président : Seiler
Le Greffier : Ermotti