Но сражение началось до подхода подкреплений – царь боялся упустить Левенгаупта, если промедлит с атакой. Битва разгорелась на небольшом поле в одну квадратную версту, что в некоторой степени уравновешивало силы сторон: шведы из-за ограниченного пространства не имели возможности воспользоваться численным преимуществом. Сражение приняло невероятно ожесточенный характер. «Обе стороны вели такой силы огонь, что нельзя было уловить отдельных выстрелов, все сливалось в сплошной грохот». Шведы выдержали десять атак русских, не раз переходили в контрнаступление. С переменным успехом битва продолжалась пять часов, не затихая ни на минуту. В конце концов «солдаты так устали, что более не могли биться, и тогда неприятель у своего обоза, а наши на боевом месте сели и довольное время отдыхали на расстоянии половины пушечного выстрела или ближе. Сей случай дивно было видеть, будто бы неприятели между собою были так кротки…». Отдых на пропитанной кровью земле продолжался около двух часов. На помощь корволанту подошел корпус Бауэра, и Петр вновь бросил полки в «великой бой, где такая была запальчивость, что пехота уже палашами рубилась… неприятеля совсем с поля сбили, пушки и обоз взяли…». С наступлением сумерек неожиданно для конца сентября повалил снег, поднялся ветер, началась метель. «…И потом тотчас ночь наступила, неприятель случай к уходу получил, а наши, где та вьюга застала, тут и ночевали…».
Левенгаупт понес огромные потери, возобновление сражение на следующий день грозило его корпусу полным уничтожением. Ночью, создавая иллюзию бивака, шведы подожгли телеги, а сами поспешно ушли к реке Сож, надеясь быстро переправиться через нее и скрыться от неизбежного преследования русской конницы. Ночь была настолько темной, что «нельзя было разглядеть протянутой руки». Не зная местности, шведы блуждали «по этим страшным и непролазным лесам, вязли в болотах», пятьсот человек отстали от своих боевых товарищей и в последующие дни были истреблены калмыцкой конницей.
На рассвете русские войска в полной боевой готовности заняли позиции, чтобы продолжить битву. Их взору предстало усеянное трупами поле, неприятель исчез. Пересчитали погибших – своих и чужих. Петр «получил совершенную викторию». Шведов полегло восемь тысяч, одна тысяча попала в плен. Левенгаупт потерял всю артиллерию, казну и обоз, состоявший из трех тысяч телег с продовольствием. Потери царя – тысяча сто убитых и около трех тысяч раненых. Петр велел похоронить всех павших. Особую заботу государь проявил по отношению к раненым, которые «ангельское, а не человеческое дело делали», лично проводил их до Смоленска, велел печь для них свежий хлеб, давать вино и пиво, распределил на лечение по монастырям.
Крупная победа под Лесной существенно подняла дух русских войск, показала, что они научились бить шведов в равном бою. Петр полагал, что оставшись без продовольствия и потеряв почти десять тысяч солдат, Карл будет вынужден пойти на мирные переговоры.
О разгроме Левенгаупта Карл узнал от солдата, который первым добрался до ставки короля через три дня после сражения. Карл счел его рассказ бредом сумасшедшего, потерявшего разум от страха. Даже в самом кошмарном сне король не мог представить, что его свежие отборные войска при полном вооружении и довольствии, могли потерпеть поражение от русских в открытом бою, при равенстве сил. Но когда объявился сам Левенгаупт с остатками корпуса, без обоза, страшный сон стал явью. Не успел Карл придти в себя от одного потрясения, как пришли плохие новости от генерала Георга Любекера, командующего корпусом в Финляндии. Он не смог противостоять войскам Федора Апраксина и взять Петербург, потеряв при этом три тысячи солдат.
Однако, ни о каком мире король не помышлял. В его колоде оставался козырь, о котором Петр даже не догадывался. Гетман Украины Иван Степанович Мазепа, верой и правдой служивший московскому царю двадцать лет, в самый ответственный момент изменил ему в пользу шведов, пообещав Карлу продовольствие, зимние квартиры, казачье войско и содействие в переговорах о военном союзе с крымским ханом.