[{"data":1,"prerenderedAt":2036},["ShallowReactive",2],{"post-\u002Fposts\u002Fleetcode-lru-merge-k-reverse-list":3,"all-posts-nav":1766},{"id":4,"title":5,"body":6,"categories":1749,"date":1751,"description":1752,"draft":1753,"extension":1754,"hidden":1753,"meta":1755,"navigation":164,"path":1756,"published":1753,"seo":1757,"stem":1758,"tags":1759,"__hash__":1765},"posts\u002Fposts\u002Fleetcode-lru-merge-k-reverse-list.md","链表与缓存高频题：LRU Cache、合并 K 个有序链表、反转链表",{"type":7,"value":8,"toc":1730},"minimark",[9,13,26,29,34,37,40,51,54,90,93,96,99,102,105,111,115,122,595,598,604,607,634,638,641,647,650,653,659,665,668,1127,1130,1140,1146,1149,1169,1172,1174,1180,1183,1189,1192,1198,1201,1466,1469,1475,1478,1509,1512,1515,1517,1523,1526,1644,1654,1657,1710,1713,1723,1726],[10,11,12],"p",{},"这篇整理三道面试特别高频的题：",[14,15,16,20,23],"ul",{},[17,18,19],"li",{},"LRU Cache。",[17,21,22],{},"合并 K 个有序链表。",[17,24,25],{},"反转链表。",[10,27,28],{},"这三题都不难背代码，但很容易在面试里卡在边界处理上。准备时重点不是“记住每一行”，而是记住数据结构选择和指针移动顺序。",[30,31,33],"h2",{"id":32},"lru-cache","LRU Cache",[10,35,36],{},"LRU 是 Least Recently Used，最近最少使用。",[10,38,39],{},"题目要求通常是：",[41,42,48],"pre",{"className":43,"code":45,"language":46,"meta":47},[44],"language-text","get(key)：如果 key 存在，返回 value，并把 key 标记为最近使用。\nput(key, value)：插入或更新 key。如果容量超了，删除最久没被使用的 key。\nget 和 put 都要 O(1)。\n","text","",[49,50,45],"code",{"__ignoreMap":47},[10,52,53],{},"要做到 O(1)，需要两个结构配合：",[55,56,57,70],"table",{},[58,59,60],"thead",{},[61,62,63,67],"tr",{},[64,65,66],"th",{},"结构",[64,68,69],{},"作用",[71,72,73,82],"tbody",{},[61,74,75,79],{},[76,77,78],"td",{},"双向链表",[76,80,81],{},"维护访问顺序，头部最近使用，尾部最久未使用",[61,83,84,87],{},[76,85,86],{},"哈希表",[76,88,89],{},"key -> 链表节点迭代器，支持 O(1) 查找",[10,91,92],{},"为什么不能只用哈希表？",[10,94,95],{},"因为哈希表只能快速查 key，不能快速知道哪个 key 最久没用。",[10,97,98],{},"为什么不能只用链表？",[10,100,101],{},"因为链表能维护顺序，但查找 key 是 O(n)。",[10,103,104],{},"所以答案是：",[41,106,109],{"className":107,"code":108,"language":46,"meta":47},[44],"unordered_map + list\n",[49,110,108],{"__ignoreMap":47},[112,113,114],"h3",{"id":114},"代码",[10,116,117,118,121],{},"LeetCode 环境下不要加 ",[49,119,120],{},"#define int long long","，否则可能改坏接口签名。",[41,123,127],{"className":124,"code":125,"language":126,"meta":47,"style":47},"language-cpp shiki shiki-themes github-dark-dimmed github-light","#include \u003Cbits\u002Fstdc++.h>\nusing namespace std;\n\nclass LRUCache {\n    int cap;\n    list\u003Cpair\u003Cint, int>> q;\n    unordered_map\u003Cint, list\u003Cpair\u003Cint, int>>::iterator> mp;\n\npublic:\n    LRUCache(int capacity) {\n        cap = capacity;\n    }\n\n    int get(int key) {\n        if (!mp.count(key)) return -1;\n        auto it = mp[key];\n        int val = it->second;\n        q.erase(it);\n        q.push_front({key, val});\n        mp[key] = q.begin();\n        return val;\n    }\n\n    void put(int key, int value) {\n        if (mp.count(key)) {\n            q.erase(mp[key]);\n        } else if ((int)q.size() == cap) {\n            auto [old_key, old_val] = q.back();\n            q.pop_back();\n            mp.erase(old_key);\n        }\n        q.push_front({key, value});\n        mp[key] = q.begin();\n    }\n};\n","cpp",[49,128,129,142,159,166,178,187,211,246,251,257,276,288,294,299,316,349,363,377,389,400,417,426,431,436,460,473,484,516,534,544,555,561,571,584,589],{"__ignoreMap":47},[130,131,134,138],"span",{"class":132,"line":133},"line",1,[130,135,137],{"class":136},"s6PUj","#include",[130,139,141],{"class":140},"sXfbr"," \u003Cbits\u002Fstdc++.h>\n",[130,143,145,148,151,155],{"class":132,"line":144},2,[130,146,147],{"class":136},"using",[130,149,150],{"class":136}," namespace",[130,152,154],{"class":153},"sqRhv"," std",[130,156,158],{"class":157},"ssh_m",";\n",[130,160,162],{"class":132,"line":161},3,[130,163,165],{"emptyLinePlaceholder":164},true,"\n",[130,167,169,172,175],{"class":132,"line":168},4,[130,170,171],{"class":136},"class",[130,173,174],{"class":153}," LRUCache",[130,176,177],{"class":157}," {\n",[130,179,181,184],{"class":132,"line":180},5,[130,182,183],{"class":136},"    int",[130,185,186],{"class":157}," cap;\n",[130,188,190,193,196,199,202,205,208],{"class":132,"line":189},6,[130,191,192],{"class":157},"    list",[130,194,195],{"class":136},"\u003C",[130,197,198],{"class":157},"pair",[130,200,201],{"class":136},"\u003Cint",[130,203,204],{"class":157},", ",[130,206,207],{"class":136},"int>>",[130,209,210],{"class":157}," q;\n",[130,212,214,217,219,221,224,226,228,230,233,235,237,240,243],{"class":132,"line":213},7,[130,215,216],{"class":157},"    unordered_map",[130,218,201],{"class":136},[130,220,204],{"class":157},[130,222,223],{"class":153},"list",[130,225,195],{"class":157},[130,227,198],{"class":153},[130,229,195],{"class":157},[130,231,232],{"class":136},"int",[130,234,204],{"class":157},[130,236,232],{"class":136},[130,238,239],{"class":157},">>::iterator",[130,241,242],{"class":136},">",[130,244,245],{"class":157}," mp;\n",[130,247,249],{"class":132,"line":248},8,[130,250,165],{"emptyLinePlaceholder":164},[130,252,254],{"class":132,"line":253},9,[130,255,256],{"class":136},"public:\n",[130,258,260,264,267,269,273],{"class":132,"line":259},10,[130,261,263],{"class":262},"saVmf","    LRUCache",[130,265,266],{"class":157},"(",[130,268,232],{"class":136},[130,270,272],{"class":271},"sNjOc"," capacity",[130,274,275],{"class":157},") {\n",[130,277,279,282,285],{"class":132,"line":278},11,[130,280,281],{"class":157},"        cap ",[130,283,284],{"class":136},"=",[130,286,287],{"class":157}," capacity;\n",[130,289,291],{"class":132,"line":290},12,[130,292,293],{"class":157},"    }\n",[130,295,297],{"class":132,"line":296},13,[130,298,165],{"emptyLinePlaceholder":164},[130,300,302,304,307,309,311,314],{"class":132,"line":301},14,[130,303,183],{"class":136},[130,305,306],{"class":262}," get",[130,308,266],{"class":157},[130,310,232],{"class":136},[130,312,313],{"class":271}," key",[130,315,275],{"class":157},[130,317,319,322,325,328,331,334,337,340,343,347],{"class":132,"line":318},15,[130,320,321],{"class":136},"        if",[130,323,324],{"class":157}," (",[130,326,327],{"class":136},"!",[130,329,330],{"class":157},"mp.",[130,332,333],{"class":262},"count",[130,335,336],{"class":157},"(key)) ",[130,338,339],{"class":136},"return",[130,341,342],{"class":136}," -",[130,344,346],{"class":345},"swcJU","1",[130,348,158],{"class":157},[130,350,352,355,358,360],{"class":132,"line":351},16,[130,353,354],{"class":136},"        auto",[130,356,357],{"class":157}," it ",[130,359,284],{"class":136},[130,361,362],{"class":157}," mp[key];\n",[130,364,366,369,372,374],{"class":132,"line":365},17,[130,367,368],{"class":136},"        int",[130,370,371],{"class":157}," val ",[130,373,284],{"class":136},[130,375,376],{"class":157}," it->second;\n",[130,378,380,383,386],{"class":132,"line":379},18,[130,381,382],{"class":157},"        q.",[130,384,385],{"class":262},"erase",[130,387,388],{"class":157},"(it);\n",[130,390,392,394,397],{"class":132,"line":391},19,[130,393,382],{"class":157},[130,395,396],{"class":262},"push_front",[130,398,399],{"class":157},"({key, val});\n",[130,401,403,406,408,411,414],{"class":132,"line":402},20,[130,404,405],{"class":157},"        mp[key] ",[130,407,284],{"class":136},[130,409,410],{"class":157}," q.",[130,412,413],{"class":262},"begin",[130,415,416],{"class":157},"();\n",[130,418,420,423],{"class":132,"line":419},21,[130,421,422],{"class":136},"        return",[130,424,425],{"class":157}," val;\n",[130,427,429],{"class":132,"line":428},22,[130,430,293],{"class":157},[130,432,434],{"class":132,"line":433},23,[130,435,165],{"emptyLinePlaceholder":164},[130,437,439,442,445,447,449,451,453,455,458],{"class":132,"line":438},24,[130,440,441],{"class":136},"    void",[130,443,444],{"class":262}," put",[130,446,266],{"class":157},[130,448,232],{"class":136},[130,450,313],{"class":271},[130,452,204],{"class":157},[130,454,232],{"class":136},[130,456,457],{"class":271}," value",[130,459,275],{"class":157},[130,461,463,465,468,470],{"class":132,"line":462},25,[130,464,321],{"class":136},[130,466,467],{"class":157}," (mp.",[130,469,333],{"class":262},[130,471,472],{"class":157},"(key)) {\n",[130,474,476,479,481],{"class":132,"line":475},26,[130,477,478],{"class":157},"            q.",[130,480,385],{"class":262},[130,482,483],{"class":157},"(mp[key]);\n",[130,485,487,490,493,496,499,501,504,507,510,513],{"class":132,"line":486},27,[130,488,489],{"class":157},"        } ",[130,491,492],{"class":136},"else",[130,494,495],{"class":136}," if",[130,497,498],{"class":157}," ((",[130,500,232],{"class":136},[130,502,503],{"class":157},")q.",[130,505,506],{"class":262},"size",[130,508,509],{"class":157},"() ",[130,511,512],{"class":136},"==",[130,514,515],{"class":157}," cap) {\n",[130,517,519,522,525,527,529,532],{"class":132,"line":518},28,[130,520,521],{"class":136},"            auto",[130,523,524],{"class":157}," [old_key, old_val] ",[130,526,284],{"class":136},[130,528,410],{"class":157},[130,530,531],{"class":262},"back",[130,533,416],{"class":157},[130,535,537,539,542],{"class":132,"line":536},29,[130,538,478],{"class":157},[130,540,541],{"class":262},"pop_back",[130,543,416],{"class":157},[130,545,547,550,552],{"class":132,"line":546},30,[130,548,549],{"class":157},"            mp.",[130,551,385],{"class":262},[130,553,554],{"class":157},"(old_key);\n",[130,556,558],{"class":132,"line":557},31,[130,559,560],{"class":157},"        }\n",[130,562,564,566,568],{"class":132,"line":563},32,[130,565,382],{"class":157},[130,567,396],{"class":262},[130,569,570],{"class":157},"({key, value});\n",[130,572,574,576,578,580,582],{"class":132,"line":573},33,[130,575,405],{"class":157},[130,577,284],{"class":136},[130,579,410],{"class":157},[130,581,413],{"class":262},[130,583,416],{"class":157},[130,585,587],{"class":132,"line":586},34,[130,588,293],{"class":157},[130,590,592],{"class":132,"line":591},35,[130,593,594],{"class":157},"};\n",[112,596,597],{"id":597},"复杂度",[41,599,602],{"className":600,"code":601,"language":46,"meta":47},[44],"get: O(1)\nput: O(1)\n空间复杂度: O(capacity)\n",[49,603,601],{"__ignoreMap":47},[112,605,606],{"id":606},"易错点",[608,609,610,616,622,625],"ol",{},[17,611,612,615],{},[49,613,614],{},"get"," 命中后也要更新访问顺序。",[17,617,618,621],{},[49,619,620],{},"put"," 更新已有 key 时，要先删除旧节点，再插入到链表头。",[17,623,624],{},"淘汰尾部节点时，要同时从链表和哈希表中删除。",[17,626,627,629,630,633],{},[49,628,223],{}," 的迭代器在对应节点被 erase 后失效，要重新写入 ",[49,631,632],{},"mp[key]","。",[30,635,637],{"id":636},"合并-k-个有序链表","合并 K 个有序链表",[10,639,640],{},"题目：",[41,642,645],{"className":643,"code":644,"language":46,"meta":47},[44],"给你 k 个升序链表，把它们合并成一个升序链表。\n",[49,646,644],{"__ignoreMap":47},[10,648,649],{},"最常用做法是小根堆。",[10,651,652],{},"思路：",[41,654,657],{"className":655,"code":656,"language":46,"meta":47},[44],"1. 把每个链表的头节点放入小根堆。\n2. 每次取出堆顶最小节点，接到答案链表后面。\n3. 如果这个节点还有 next，就把 next 放入堆。\n4. 直到堆为空。\n",[49,658,656],{"__ignoreMap":47},[10,660,661,662,633],{},"堆里最多有 k 个节点，所以每次 push \u002F pop 是 ",[49,663,664],{},"O(log k)",[112,666,114],{"id":667},"代码-1",[41,669,671],{"className":124,"code":670,"language":126,"meta":47,"style":47},"#include \u003Cbits\u002Fstdc++.h>\nusing namespace std;\n\nstruct ListNode {\n    int val;\n    ListNode *next;\n    ListNode() : val(0), next(nullptr) {}\n    ListNode(int x) : val(x), next(nullptr) {}\n    ListNode(int x, ListNode *next) : val(x), next(next) {}\n};\n\nclass Solution {\npublic:\n    ListNode* mergeKLists(vector\u003CListNode*>& lists) {\n        auto cmp = [](ListNode* a, ListNode* b) {\n            return a->val > b->val;\n        };\n        priority_queue\u003CListNode*, vector\u003CListNode*>, decltype(cmp)> pq(cmp);\n\n        for (auto node : lists) {\n            if (node) pq.push(node);\n        }\n\n        ListNode dummy(0);\n        ListNode* cur = &dummy;\n\n        while (!pq.empty()) {\n            auto node = pq.top();\n            pq.pop();\n            cur->next = node;\n            cur = cur->next;\n\n            if (node->next) pq.push(node->next);\n        }\n\n        return dummy.next;\n    }\n};\n",[49,672,673,679,689,693,703,709,720,750,777,808,812,816,825,829,859,889,902,907,944,948,961,975,979,983,998,1016,1020,1038,1055,1065,1075,1085,1089,1101,1105,1109,1117,1122],{"__ignoreMap":47},[130,674,675,677],{"class":132,"line":133},[130,676,137],{"class":136},[130,678,141],{"class":140},[130,680,681,683,685,687],{"class":132,"line":144},[130,682,147],{"class":136},[130,684,150],{"class":136},[130,686,154],{"class":153},[130,688,158],{"class":157},[130,690,691],{"class":132,"line":161},[130,692,165],{"emptyLinePlaceholder":164},[130,694,695,698,701],{"class":132,"line":168},[130,696,697],{"class":136},"struct",[130,699,700],{"class":153}," ListNode",[130,702,177],{"class":157},[130,704,705,707],{"class":132,"line":180},[130,706,183],{"class":136},[130,708,425],{"class":157},[130,710,711,714,717],{"class":132,"line":189},[130,712,713],{"class":157},"    ListNode ",[130,715,716],{"class":136},"*",[130,718,719],{"class":157},"next;\n",[130,721,722,725,728,731,733,736,739,742,744,747],{"class":132,"line":213},[130,723,724],{"class":262},"    ListNode",[130,726,727],{"class":157},"() : ",[130,729,730],{"class":262},"val",[130,732,266],{"class":157},[130,734,735],{"class":345},"0",[130,737,738],{"class":157},"), ",[130,740,741],{"class":262},"next",[130,743,266],{"class":157},[130,745,746],{"class":345},"nullptr",[130,748,749],{"class":157},") {}\n",[130,751,752,754,756,758,761,764,766,769,771,773,775],{"class":132,"line":248},[130,753,724],{"class":262},[130,755,266],{"class":157},[130,757,232],{"class":136},[130,759,760],{"class":271}," x",[130,762,763],{"class":157},") : ",[130,765,730],{"class":262},[130,767,768],{"class":157},"(x), ",[130,770,741],{"class":262},[130,772,266],{"class":157},[130,774,746],{"class":345},[130,776,749],{"class":157},[130,778,779,781,783,785,787,789,792,795,797,799,801,803,805],{"class":132,"line":253},[130,780,724],{"class":262},[130,782,266],{"class":157},[130,784,232],{"class":136},[130,786,760],{"class":271},[130,788,204],{"class":157},[130,790,791],{"class":153},"ListNode",[130,793,794],{"class":136}," *",[130,796,741],{"class":271},[130,798,763],{"class":157},[130,800,730],{"class":262},[130,802,768],{"class":157},[130,804,741],{"class":262},[130,806,807],{"class":157},"(next) {}\n",[130,809,810],{"class":132,"line":259},[130,811,594],{"class":157},[130,813,814],{"class":132,"line":278},[130,815,165],{"emptyLinePlaceholder":164},[130,817,818,820,823],{"class":132,"line":290},[130,819,171],{"class":136},[130,821,822],{"class":153}," Solution",[130,824,177],{"class":157},[130,826,827],{"class":132,"line":296},[130,828,256],{"class":136},[130,830,831,833,835,838,840,843,845,847,849,851,854,857],{"class":132,"line":301},[130,832,724],{"class":153},[130,834,716],{"class":136},[130,836,837],{"class":262}," mergeKLists",[130,839,266],{"class":157},[130,841,842],{"class":153},"vector",[130,844,195],{"class":157},[130,846,791],{"class":153},[130,848,716],{"class":136},[130,850,242],{"class":157},[130,852,853],{"class":136},"&",[130,855,856],{"class":271}," lists",[130,858,275],{"class":157},[130,860,861,863,866,868,871,873,875,878,880,882,884,887],{"class":132,"line":318},[130,862,354],{"class":136},[130,864,865],{"class":157}," cmp ",[130,867,284],{"class":136},[130,869,870],{"class":157}," [](",[130,872,791],{"class":153},[130,874,716],{"class":136},[130,876,877],{"class":271}," a",[130,879,204],{"class":157},[130,881,791],{"class":153},[130,883,716],{"class":136},[130,885,886],{"class":271}," b",[130,888,275],{"class":157},[130,890,891,894,897,899],{"class":132,"line":351},[130,892,893],{"class":136},"            return",[130,895,896],{"class":157}," a->val ",[130,898,242],{"class":136},[130,900,901],{"class":157}," b->val;\n",[130,903,904],{"class":132,"line":365},[130,905,906],{"class":157},"        };\n",[130,908,909,912,914,916,918,921,923,925,928,930,933,936,938,941],{"class":132,"line":379},[130,910,911],{"class":157},"        priority_queue",[130,913,195],{"class":136},[130,915,791],{"class":157},[130,917,716],{"class":136},[130,919,920],{"class":157},", vector",[130,922,195],{"class":136},[130,924,791],{"class":157},[130,926,927],{"class":136},"*>",[130,929,204],{"class":157},[130,931,932],{"class":136},"decltype",[130,934,935],{"class":157},"(cmp)",[130,937,242],{"class":136},[130,939,940],{"class":262}," pq",[130,942,943],{"class":157},"(cmp);\n",[130,945,946],{"class":132,"line":391},[130,947,165],{"emptyLinePlaceholder":164},[130,949,950,953,955,958],{"class":132,"line":402},[130,951,952],{"class":136},"        for",[130,954,324],{"class":157},[130,956,957],{"class":136},"auto",[130,959,960],{"class":157}," node : lists) {\n",[130,962,963,966,969,972],{"class":132,"line":419},[130,964,965],{"class":136},"            if",[130,967,968],{"class":157}," (node) pq.",[130,970,971],{"class":262},"push",[130,973,974],{"class":157},"(node);\n",[130,976,977],{"class":132,"line":428},[130,978,560],{"class":157},[130,980,981],{"class":132,"line":433},[130,982,165],{"emptyLinePlaceholder":164},[130,984,985,988,991,993,995],{"class":132,"line":438},[130,986,987],{"class":157},"        ListNode ",[130,989,990],{"class":262},"dummy",[130,992,266],{"class":157},[130,994,735],{"class":345},[130,996,997],{"class":157},");\n",[130,999,1000,1003,1005,1008,1010,1013],{"class":132,"line":462},[130,1001,1002],{"class":157},"        ListNode",[130,1004,716],{"class":136},[130,1006,1007],{"class":157}," cur ",[130,1009,284],{"class":136},[130,1011,1012],{"class":136}," &",[130,1014,1015],{"class":157},"dummy;\n",[130,1017,1018],{"class":132,"line":475},[130,1019,165],{"emptyLinePlaceholder":164},[130,1021,1022,1025,1027,1029,1032,1035],{"class":132,"line":486},[130,1023,1024],{"class":136},"        while",[130,1026,324],{"class":157},[130,1028,327],{"class":136},[130,1030,1031],{"class":157},"pq.",[130,1033,1034],{"class":262},"empty",[130,1036,1037],{"class":157},"()) {\n",[130,1039,1040,1042,1045,1047,1050,1053],{"class":132,"line":518},[130,1041,521],{"class":136},[130,1043,1044],{"class":157}," node ",[130,1046,284],{"class":136},[130,1048,1049],{"class":157}," pq.",[130,1051,1052],{"class":262},"top",[130,1054,416],{"class":157},[130,1056,1057,1060,1063],{"class":132,"line":536},[130,1058,1059],{"class":157},"            pq.",[130,1061,1062],{"class":262},"pop",[130,1064,416],{"class":157},[130,1066,1067,1070,1072],{"class":132,"line":546},[130,1068,1069],{"class":157},"            cur->next ",[130,1071,284],{"class":136},[130,1073,1074],{"class":157}," node;\n",[130,1076,1077,1080,1082],{"class":132,"line":557},[130,1078,1079],{"class":157},"            cur ",[130,1081,284],{"class":136},[130,1083,1084],{"class":157}," cur->next;\n",[130,1086,1087],{"class":132,"line":563},[130,1088,165],{"emptyLinePlaceholder":164},[130,1090,1091,1093,1096,1098],{"class":132,"line":573},[130,1092,965],{"class":136},[130,1094,1095],{"class":157}," (node->next) pq.",[130,1097,971],{"class":262},[130,1099,1100],{"class":157},"(node->next);\n",[130,1102,1103],{"class":132,"line":586},[130,1104,560],{"class":157},[130,1106,1107],{"class":132,"line":591},[130,1108,165],{"emptyLinePlaceholder":164},[130,1110,1112,1114],{"class":132,"line":1111},36,[130,1113,422],{"class":136},[130,1115,1116],{"class":157}," dummy.next;\n",[130,1118,1120],{"class":132,"line":1119},37,[130,1121,293],{"class":157},[130,1123,1125],{"class":132,"line":1124},38,[130,1126,594],{"class":157},[112,1128,597],{"id":1129},"复杂度-1",[10,1131,1132,1133,1136,1137,633],{},"设总节点数为 ",[49,1134,1135],{},"N","，链表个数为 ",[49,1138,1139],{},"k",[41,1141,1144],{"className":1142,"code":1143,"language":46,"meta":47},[44],"时间复杂度: O(N log k)\n空间复杂度: O(k)\n",[49,1145,1143],{"__ignoreMap":47},[112,1147,606],{"id":1148},"易错点-1",[608,1150,1151,1154,1157,1166],{},[17,1152,1153],{},"堆里放的是节点指针，不是节点值。否则还要重新建节点。",[17,1155,1156],{},"空链表不要放进堆。",[17,1158,1159,1162,1163,633],{},[49,1160,1161],{},"priority_queue"," 默认是大根堆，所以比较函数要写成 ",[49,1164,1165],{},"a->val > b->val",[17,1167,1168],{},"用 dummy 节点可以避免处理头节点为空的特殊情况。",[30,1170,1171],{"id":1171},"反转链表",[10,1173,640],{},[41,1175,1178],{"className":1176,"code":1177,"language":46,"meta":47},[44],"给定单链表头节点 head，反转整个链表，返回新的头节点。\n",[49,1179,1177],{"__ignoreMap":47},[10,1181,1182],{},"核心就是三指针：",[41,1184,1187],{"className":1185,"code":1186,"language":46,"meta":47},[44],"prev：已经反转好的前半部分头节点\ncur：当前正在处理的节点\nnxt：提前保存 cur->next，避免断链后找不到后续节点\n",[49,1188,1186],{"__ignoreMap":47},[10,1190,1191],{},"每轮做四件事：",[41,1193,1196],{"className":1194,"code":1195,"language":46,"meta":47},[44],"nxt = cur->next\ncur->next = prev\nprev = cur\ncur = nxt\n",[49,1197,1195],{"__ignoreMap":47},[112,1199,114],{"id":1200},"代码-2",[41,1202,1204],{"className":124,"code":1203,"language":126,"meta":47,"style":47},"#include \u003Cbits\u002Fstdc++.h>\nusing namespace std;\n\nstruct ListNode {\n    int val;\n    ListNode *next;\n    ListNode() : val(0), next(nullptr) {}\n    ListNode(int x) : val(x), next(nullptr) {}\n    ListNode(int x, ListNode *next) : val(x), next(next) {}\n};\n\nclass Solution {\npublic:\n    ListNode* reverseList(ListNode* head) {\n        ListNode* prev = nullptr;\n        ListNode* cur = head;\n\n        while (cur) {\n            ListNode* nxt = cur->next;\n            cur->next = prev;\n            prev = cur;\n            cur = nxt;\n        }\n\n        return prev;\n    }\n};\n",[49,1205,1206,1212,1222,1226,1234,1240,1248,1270,1294,1322,1326,1330,1338,1342,1362,1378,1391,1395,1402,1416,1425,1435,1444,1448,1452,1458,1462],{"__ignoreMap":47},[130,1207,1208,1210],{"class":132,"line":133},[130,1209,137],{"class":136},[130,1211,141],{"class":140},[130,1213,1214,1216,1218,1220],{"class":132,"line":144},[130,1215,147],{"class":136},[130,1217,150],{"class":136},[130,1219,154],{"class":153},[130,1221,158],{"class":157},[130,1223,1224],{"class":132,"line":161},[130,1225,165],{"emptyLinePlaceholder":164},[130,1227,1228,1230,1232],{"class":132,"line":168},[130,1229,697],{"class":136},[130,1231,700],{"class":153},[130,1233,177],{"class":157},[130,1235,1236,1238],{"class":132,"line":180},[130,1237,183],{"class":136},[130,1239,425],{"class":157},[130,1241,1242,1244,1246],{"class":132,"line":189},[130,1243,713],{"class":157},[130,1245,716],{"class":136},[130,1247,719],{"class":157},[130,1249,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268],{"class":132,"line":213},[130,1251,724],{"class":262},[130,1253,727],{"class":157},[130,1255,730],{"class":262},[130,1257,266],{"class":157},[130,1259,735],{"class":345},[130,1261,738],{"class":157},[130,1263,741],{"class":262},[130,1265,266],{"class":157},[130,1267,746],{"class":345},[130,1269,749],{"class":157},[130,1271,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292],{"class":132,"line":248},[130,1273,724],{"class":262},[130,1275,266],{"class":157},[130,1277,232],{"class":136},[130,1279,760],{"class":271},[130,1281,763],{"class":157},[130,1283,730],{"class":262},[130,1285,768],{"class":157},[130,1287,741],{"class":262},[130,1289,266],{"class":157},[130,1291,746],{"class":345},[130,1293,749],{"class":157},[130,1295,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320],{"class":132,"line":253},[130,1297,724],{"class":262},[130,1299,266],{"class":157},[130,1301,232],{"class":136},[130,1303,760],{"class":271},[130,1305,204],{"class":157},[130,1307,791],{"class":153},[130,1309,794],{"class":136},[130,1311,741],{"class":271},[130,1313,763],{"class":157},[130,1315,730],{"class":262},[130,1317,768],{"class":157},[130,1319,741],{"class":262},[130,1321,807],{"class":157},[130,1323,1324],{"class":132,"line":259},[130,1325,594],{"class":157},[130,1327,1328],{"class":132,"line":278},[130,1329,165],{"emptyLinePlaceholder":164},[130,1331,1332,1334,1336],{"class":132,"line":290},[130,1333,171],{"class":136},[130,1335,822],{"class":153},[130,1337,177],{"class":157},[130,1339,1340],{"class":132,"line":296},[130,1341,256],{"class":136},[130,1343,1344,1346,1348,1351,1353,1355,1357,1360],{"class":132,"line":301},[130,1345,724],{"class":153},[130,1347,716],{"class":136},[130,1349,1350],{"class":262}," reverseList",[130,1352,266],{"class":157},[130,1354,791],{"class":153},[130,1356,716],{"class":136},[130,1358,1359],{"class":271}," head",[130,1361,275],{"class":157},[130,1363,1364,1366,1368,1371,1373,1376],{"class":132,"line":318},[130,1365,1002],{"class":157},[130,1367,716],{"class":136},[130,1369,1370],{"class":157}," prev ",[130,1372,284],{"class":136},[130,1374,1375],{"class":345}," nullptr",[130,1377,158],{"class":157},[130,1379,1380,1382,1384,1386,1388],{"class":132,"line":351},[130,1381,1002],{"class":157},[130,1383,716],{"class":136},[130,1385,1007],{"class":157},[130,1387,284],{"class":136},[130,1389,1390],{"class":157}," head;\n",[130,1392,1393],{"class":132,"line":365},[130,1394,165],{"emptyLinePlaceholder":164},[130,1396,1397,1399],{"class":132,"line":379},[130,1398,1024],{"class":136},[130,1400,1401],{"class":157}," (cur) {\n",[130,1403,1404,1407,1409,1412,1414],{"class":132,"line":391},[130,1405,1406],{"class":157},"            ListNode",[130,1408,716],{"class":136},[130,1410,1411],{"class":157}," nxt ",[130,1413,284],{"class":136},[130,1415,1084],{"class":157},[130,1417,1418,1420,1422],{"class":132,"line":402},[130,1419,1069],{"class":157},[130,1421,284],{"class":136},[130,1423,1424],{"class":157}," prev;\n",[130,1426,1427,1430,1432],{"class":132,"line":419},[130,1428,1429],{"class":157},"            prev ",[130,1431,284],{"class":136},[130,1433,1434],{"class":157}," cur;\n",[130,1436,1437,1439,1441],{"class":132,"line":428},[130,1438,1079],{"class":157},[130,1440,284],{"class":136},[130,1442,1443],{"class":157}," nxt;\n",[130,1445,1446],{"class":132,"line":433},[130,1447,560],{"class":157},[130,1449,1450],{"class":132,"line":438},[130,1451,165],{"emptyLinePlaceholder":164},[130,1453,1454,1456],{"class":132,"line":462},[130,1455,422],{"class":136},[130,1457,1424],{"class":157},[130,1459,1460],{"class":132,"line":475},[130,1461,293],{"class":157},[130,1463,1464],{"class":132,"line":486},[130,1465,594],{"class":157},[112,1467,597],{"id":1468},"复杂度-2",[41,1470,1473],{"className":1471,"code":1472,"language":46,"meta":47},[44],"时间复杂度: O(n)\n空间复杂度: O(1)\n",[49,1474,1472],{"__ignoreMap":47},[112,1476,606],{"id":1477},"易错点-2",[608,1479,1480,1490,1506],{},[17,1481,1482,1483,1486,1487,633],{},"一定要先保存 ",[49,1484,1485],{},"nxt = cur->next","，再改 ",[49,1488,1489],{},"cur->next",[17,1491,1492,1493,1496,1497,1500,1501,1503,1504,633],{},"最后返回 ",[49,1494,1495],{},"prev","，不是 ",[49,1498,1499],{},"cur","。循环结束时 ",[49,1502,1499],{}," 已经是 ",[49,1505,746],{},[17,1507,1508],{},"空链表和单节点链表天然兼容，不需要单独判断。",[30,1510,1511],{"id":1511},"递归版反转链表",[10,1513,1514],{},"递归版面试偶尔会追问。",[10,1516,652],{},[41,1518,1521],{"className":1519,"code":1520,"language":46,"meta":47},[44],"先反转 head->next 后面的链表\n再让 head->next->next 指回 head\n最后断开 head->next\n",[49,1522,1520],{"__ignoreMap":47},[10,1524,1525],{},"代码：",[41,1527,1529],{"className":124,"code":1528,"language":126,"meta":47,"style":47},"class Solution {\npublic:\n    ListNode* reverseList(ListNode* head) {\n        if (!head || !head->next) return head;\n\n        ListNode* new_head = reverseList(head->next);\n        head->next->next = head;\n        head->next = nullptr;\n\n        return new_head;\n    }\n};\n",[49,1530,1531,1539,1543,1561,1585,1589,1605,1614,1625,1629,1636,1640],{"__ignoreMap":47},[130,1532,1533,1535,1537],{"class":132,"line":133},[130,1534,171],{"class":136},[130,1536,822],{"class":153},[130,1538,177],{"class":157},[130,1540,1541],{"class":132,"line":144},[130,1542,256],{"class":136},[130,1544,1545,1547,1549,1551,1553,1555,1557,1559],{"class":132,"line":161},[130,1546,724],{"class":153},[130,1548,716],{"class":136},[130,1550,1350],{"class":262},[130,1552,266],{"class":157},[130,1554,791],{"class":153},[130,1556,716],{"class":136},[130,1558,1359],{"class":271},[130,1560,275],{"class":157},[130,1562,1563,1565,1567,1569,1572,1575,1578,1581,1583],{"class":132,"line":168},[130,1564,321],{"class":136},[130,1566,324],{"class":157},[130,1568,327],{"class":136},[130,1570,1571],{"class":157},"head ",[130,1573,1574],{"class":136},"||",[130,1576,1577],{"class":136}," !",[130,1579,1580],{"class":157},"head->next) ",[130,1582,339],{"class":136},[130,1584,1390],{"class":157},[130,1586,1587],{"class":132,"line":180},[130,1588,165],{"emptyLinePlaceholder":164},[130,1590,1591,1593,1595,1598,1600,1602],{"class":132,"line":189},[130,1592,1002],{"class":157},[130,1594,716],{"class":136},[130,1596,1597],{"class":157}," new_head ",[130,1599,284],{"class":136},[130,1601,1350],{"class":262},[130,1603,1604],{"class":157},"(head->next);\n",[130,1606,1607,1610,1612],{"class":132,"line":213},[130,1608,1609],{"class":157},"        head->next->next ",[130,1611,284],{"class":136},[130,1613,1390],{"class":157},[130,1615,1616,1619,1621,1623],{"class":132,"line":248},[130,1617,1618],{"class":157},"        head->next ",[130,1620,284],{"class":136},[130,1622,1375],{"class":345},[130,1624,158],{"class":157},[130,1626,1627],{"class":132,"line":253},[130,1628,165],{"emptyLinePlaceholder":164},[130,1630,1631,1633],{"class":132,"line":259},[130,1632,422],{"class":136},[130,1634,1635],{"class":157}," new_head;\n",[130,1637,1638],{"class":132,"line":278},[130,1639,293],{"class":157},[130,1641,1642],{"class":132,"line":290},[130,1643,594],{"class":157},[10,1645,1646,1647,1650,1651,1653],{},"递归版时间复杂度也是 ",[49,1648,1649],{},"O(n)","，但空间复杂度是递归栈 ",[49,1652,1649],{},"。面试中如果没有特殊要求，迭代版更稳。",[30,1655,1656],{"id":1656},"三题总结",[55,1658,1659,1671],{},[58,1660,1661],{},[61,1662,1663,1666,1669],{},[64,1664,1665],{},"题目",[64,1667,1668],{},"核心数据结构 \u002F 技巧",[64,1670,597],{},[71,1672,1673,1687,1699],{},[61,1674,1675,1677,1682],{},[76,1676,33],{},[76,1678,1679],{},[49,1680,1681],{},"unordered_map + list",[76,1683,1684],{},[49,1685,1686],{},"O(1)",[61,1688,1689,1691,1694],{},[76,1690,637],{},[76,1692,1693],{},"小根堆",[76,1695,1696],{},[49,1697,1698],{},"O(N log k)",[61,1700,1701,1703,1706],{},[76,1702,1171],{},[76,1704,1705],{},"三指针",[76,1707,1708],{},[49,1709,1649],{},[10,1711,1712],{},"面试表达可以这样说：",[1714,1715,1716],"blockquote",{},[10,1717,1718,1719,1722],{},"LRU 的关键是哈希表定位节点、双向链表维护访问顺序；合并 K 个有序链表用小根堆维护当前 k 个链表头节点，每次取最小；反转链表用 ",[49,1720,1721],{},"prev \u002F cur \u002F nxt"," 三个指针，先保存后继，再反转当前指针。",[10,1724,1725],{},"这三题都属于基础但高频的“不能错”题。代码最好能手写到没有停顿，尤其是 LRU 的哈希表和链表同步更新，以及反转链表的指针顺序。",[1727,1728,1729],"style",{},"html pre.shiki code .s6PUj, html code.shiki .s6PUj{--shiki-default:#F47067;--shiki-light:#D73A49}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html pre.shiki code .sqRhv, html code.shiki .sqRhv{--shiki-default:#F69D50;--shiki-light:#6F42C1}html pre.shiki code .ssh_m, html code.shiki .ssh_m{--shiki-default:#ADBAC7;--shiki-light:#24292E}html pre.shiki code .saVmf, html code.shiki .saVmf{--shiki-default:#DCBDFB;--shiki-light:#6F42C1}html pre.shiki code .sNjOc, html code.shiki .sNjOc{--shiki-default:#F69D50;--shiki-light:#E36209}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":47,"searchDepth":144,"depth":161,"links":1731},[1732,1737,1742,1747,1748],{"id":32,"depth":144,"text":33,"children":1733},[1734,1735,1736],{"id":114,"depth":161,"text":114},{"id":597,"depth":161,"text":597},{"id":606,"depth":161,"text":606},{"id":636,"depth":144,"text":637,"children":1738},[1739,1740,1741],{"id":667,"depth":161,"text":114},{"id":1129,"depth":161,"text":597},{"id":1148,"depth":161,"text":606},{"id":1171,"depth":144,"text":1171,"children":1743},[1744,1745,1746],{"id":1200,"depth":161,"text":114},{"id":1468,"depth":161,"text":597},{"id":1477,"depth":161,"text":606},{"id":1511,"depth":144,"text":1511},{"id":1656,"depth":144,"text":1656},[1750],"技术","2026-06-09","面试高频算法题速记，整理 LRU Cache、合并 K 个有序链表、反转链表的核心思路、复杂度和 C++ 代码。",false,"md",{},"\u002Fposts\u002Fleetcode-lru-merge-k-reverse-list",{"title":5,"description":1752},"posts\u002Fleetcode-lru-merge-k-reverse-list",[1760,1761,1762,1763,1764],"算法","链表","LRU","LeetCode","面试","Bu3funh4N8F512Ohkp5OqCGh5ri4rwBWhR3JDqCXD18",[1767,1780,1792,1798,1808,1817,1826,1829,1839,1848,1857,1868,1880,1892,1900,1910,1922,1933,1943,1951,1962,1968,1974,1980,1988,1997,2005,2011,2019,2027],{"slug":1768,"path":1769,"title":1770,"date":1771,"tags":1772,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":253},"multimodal-rag-from-scratch","\u002Fposts\u002Fmultimodal-rag-from-scratch","从零实现多模态 RAG：BM25、Dense 检索、RRF 融合、MMR 重排全部手写","2026-06-30 18:00:00",[1773,1774,1775,1776,1777,1778,1779],"RAG","多模态","AI Infra","BM25","向量检索","混合检索","实习求职",{"slug":1781,"path":1782,"title":1783,"date":1784,"tags":1785,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":278},"mini-llm-engine-deep-dive","\u002Fposts\u002Fmini-llm-engine-deep-dive","讲透 mini-llm-engine：从显存碎片到六大推理优化","2026-06-30 14:00:00",[1786,1775,1787,1788,1789,1790,1791,1779],"LLM","vLLM","PagedAttention","KV Cache","推理优化","投机解码",{"slug":1793,"path":1794,"title":1795,"date":1796,"tags":1797,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":259},"mini-llm-engine-from-scratch","\u002Fposts\u002Fmini-llm-engine-from-scratch","从零实现 LLM 推理引擎：深挖 vLLM 的六大核心优化","2026-06-30 10:00:00",[1786,1775,1787,1788,1790,1791,1779],{"slug":1799,"path":1800,"title":1801,"date":1751,"tags":1802,"description":1807,"draft":1753,"hidden":1753,"published":164,"readingTime":379},"bytedance-recommendation-architecture-intern-interview","\u002Fposts\u002Fbytedance-recommendation-architecture-intern-interview","字节推荐架构实习生 Data 面试准备：推荐系统、实时特征与高并发八股",[1764,1803,1804,1805,1806],"推荐系统","后端架构","实时计算","字节跳动","面向字节跳动推荐架构团队实习岗位的八股准备清单，覆盖推荐系统链路、实时数据、特征服务、高并发后端、分布式系统与项目包装。",{"slug":1809,"path":1810,"title":1811,"date":1751,"tags":1812,"description":1816,"draft":1753,"hidden":1753,"published":164,"readingTime":290},"high-concurrency-rate-limiting-algorithms","\u002Fposts\u002Fhigh-concurrency-rate-limiting-algorithms","高并发限流算法：固定窗口、滑动窗口、漏桶与令牌桶",[1813,1814,1804,1815,1764],"高并发","限流","系统设计","面试和工程都常见的限流算法总结，讲清楚固定窗口、滑动窗口、漏桶、令牌桶、并发数限制以及分布式限流如何落地。",{"slug":1818,"path":1819,"title":1820,"date":1751,"tags":1821,"description":1825,"draft":1753,"hidden":1753,"published":164,"readingTime":248},"kafka-producer-broker-consumer","\u002Fposts\u002Fkafka-producer-broker-consumer","Kafka 入门：生产者、Broker、消费者和“消费”到底是什么意思",[1822,1823,1824,1764,1803],"Kafka","消息队列","后端","用推荐系统里的用户行为日志为例，讲清楚 Kafka 的作用、Producer、Broker、Consumer、Topic、Partition、Offset 和消费语义。",{"slug":1827,"path":1756,"title":5,"date":1751,"tags":1828,"description":1752,"draft":1753,"hidden":1753,"published":164,"readingTime":189},"leetcode-lru-merge-k-reverse-list",[1760,1761,1762,1763,1764],{"slug":1830,"path":1831,"title":1832,"date":1833,"tags":1834,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":351},"meddococr-interpreter-source-analysis","\u002Fposts\u002Fmeddococr-interpreter-source-analysis","MedDocOCR-Interpreter 源码导读：医疗文档 OCR、结构化抽取与报告解读原型","2026-05-22 10:30:00",[1835,1774,1836,1773,1837,1838],"OCR","医疗 AI","Python","源码分析",{"slug":1840,"path":1841,"title":1842,"date":1843,"tags":1844,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":259},"cet6-writing-model-essays","\u002Fposts\u002Fcet6-writing-model-essays","六级写作范文背诵包：10 个高频话题","2026-05-20 09:00:00",[1845,1846,1847],"English","CET6","Writing",{"slug":1849,"path":1850,"title":1851,"date":1852,"tags":1853,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":486},"claude-code-context-management","\u002Fposts\u002Fclaude-code-context-management","Claude Code 上下文管理机制：从 Microcompact 到 Auto Compact","2026-05-19 10:00:00",[1854,1855,1786,1775,1856],"Claude Code","Agent","上下文工程",{"slug":1858,"path":1859,"title":1860,"date":1861,"tags":1862,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":391},"nanotron-llm-pretraining-framework-analysis","\u002Fposts\u002Fnanotron-llm-pretraining-framework-analysis","Nanotron 项目详解：Hugging Face 的大模型预训练框架怎么做分布式训练","2026-05-10 12:10:00",[1786,1863,1864,1865,1866,1775,1867],"大模型训练","分布式训练","Nanotron","Hugging Face","PyTorch",{"slug":1869,"path":1870,"title":1871,"date":1872,"tags":1873,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":462},"gofoundry-go-backend-foundation-framework","\u002Fposts\u002Fgofoundry-go-backend-foundation-framework","GoFoundry 项目详解：基于 Go 的后端基础框架套件设计","2026-05-10 11:20:00",[1874,1875,1876,1877,1878,1823,1879],"Go","后端框架","ORM","分布式缓存","分布式锁","项目架构",{"slug":1881,"path":1882,"title":1883,"date":1884,"tags":1885,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":486},"cloudvault-go-cloud-storage-system","\u002Fposts\u002Fcloudvault-go-cloud-storage-system","CloudVault 项目详解：基于 Go 的云端存储与网盘系统架构设计","2026-05-10 10:30:00",[1874,1886,1887,1888,1879,1889,1890,1891],"云存储","网盘系统","分布式系统","Redis","RabbitMQ","Elasticsearch",{"slug":1893,"path":1894,"title":1895,"date":1896,"tags":1897,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":402},"openclaw-source-code-analysis","\u002Fposts\u002Fopenclaw-source-code-analysis","OpenClaw 源码导读：个人 AI 助手的网关、通道、插件与运行时架构","2026-05-08 16:30:00",[1898,1855,1775,1899,1838],"OpenClaw","TypeScript",{"slug":1901,"path":1902,"title":1903,"date":1904,"tags":1905,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":259},"flow-matching-generative-models","\u002Fposts\u002Fflow-matching-generative-models","Flow Matching：从噪声到数据的连续流生成模型","2026-05-07 00:00:00",[1906,1907,1908,1909],"生成模型","Diffusion","Flow Matching","深度学习",{"slug":1911,"path":1912,"title":1913,"date":1914,"tags":1915,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":318},"database-ai-week4","\u002Fposts\u002Fdatabase-ai-week4","Week 4：数据库速成——从 Storage、Index、Query Optimization 到 Vector DB 与 RAG","2026-05-05 12:00:00",[1916,1917,1918,1773,1919,1920,1921],"数据库","CMU 15-445","Vector DB","LLM Memory","Query Optimization","Caching",{"slug":1923,"path":1924,"title":1925,"date":1926,"tags":1927,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":351},"distributed-systems-week3","\u002Fposts\u002Fdistributed-systems-week3","Week 3：分布式系统速成——MapReduce、Raft、容错与 Distributed KV Store","2026-05-05 11:00:00",[1888,1928,1929,1930,1931,1932,1855],"MIT 6.824","MapReduce","Raft","KV Store","Ray",{"slug":1934,"path":1935,"title":1936,"date":1937,"tags":1938,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":318},"gpu-inference-acceleration-week2","\u002Fposts\u002Fgpu-inference-acceleration-week2","Week 2：GPU 与推理加速——从 Kernel、算子融合到 LLM Serving","2026-05-05 10:00:00",[1909,1939,1940,1786,1941,1787,1942],"GPU","推理加速","CMU 10-414","TensorRT",{"slug":1944,"path":1945,"title":1946,"date":1947,"tags":1948,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":379},"dl-framework-autograd-mini","\u002Fposts\u002Fdl-framework-autograd-mini","Week 1：DL 框架与 Autograd——从计算图、反向传播到 Mini Autograd 实现","2026-05-05 09:00:00",[1909,1949,1867,1941,1950],"Autograd","Mini Framework",{"slug":1952,"path":1953,"title":1954,"date":1955,"tags":1956,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":290},"lock-free-concurrency-notes","\u002Fposts\u002Flock-free-concurrency-notes","无锁并发入门：从 CAS 到 Atomic Ring Buffer","2026-04-25",[1957,1958,1959,1960,1961],"C++","并发","无锁编程","性能优化","量化开发",{"slug":1963,"path":1964,"title":1965,"date":1966,"tags":1967,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":180},"agent-memory","\u002Fposts\u002Fagent-memory","Agent 对话记忆化：从原理到实现","2026-04-24",[1786,1855,1773,1764],{"slug":1969,"path":1970,"title":1971,"date":1966,"tags":1972,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":189},"llm-context-compression","\u002Fposts\u002Fllm-context-compression","LLM 上下文五层压缩机制详解",[1786,1855,1973,1764],"上下文压缩",{"slug":1975,"path":1976,"title":1977,"date":1978,"tags":1979,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":253},"cpp-concurrency-basics","\u002Fposts\u002Fcpp-concurrency-basics","C++ 并发编程入门：从数据竞争到线程池","2026-04-15",[1957,1958,1764,1961],{"slug":1981,"path":1982,"title":1983,"date":1984,"tags":1985,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":133},"travel-in-shenzhen","\u002Fposts\u002Ftravel-in-shenzhen","XCPC 深圳游记","2026-04-13",[1986,1957,1987],"XCPC","比赛",{"slug":1989,"path":1990,"title":1991,"date":1992,"tags":1993,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":213},"backend-stack-deep-dive","\u002Fposts\u002Fbackend-stack-deep-dive","后端五件套：FastAPI \u002F Node.js \u002F SQLAlchemy async \u002F PostgreSQL \u002F Docker 面试速通","2026-04-07",[1824,1994,1995,1996,1764],"FastAPI","PostgreSQL","Docker",{"slug":1998,"path":1999,"title":2000,"date":2001,"tags":2002,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":189},"deepscientist-tech-stack","\u002Fposts\u002Fdeepscientist-tech-stack","DeepScientist 技术栈全解析：一个 AI 科研平台的架构设计","2026-04-06",[2003,1994,2004,1995,1764],"全栈","Next.js",{"slug":2006,"path":2007,"title":2008,"date":2001,"tags":2009,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":248},"minicode-source-analysis","\u002Fposts\u002Fminicode-source-analysis","MiniCode 源码解析：用 5000 行 TypeScript 实现一个 AI 编程助手",[1899,2010,1786,1838,1764],"CLI",{"slug":2012,"path":2013,"title":2014,"date":2001,"tags":2015,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":180},"nova-theme-implementation","\u002Fposts\u002Fnova-theme-implementation","我是怎么从零实现 Nova 主题的",[2016,2017,2018],"Hexo","前端","开源",{"slug":2020,"path":2021,"title":2022,"date":2023,"tags":2024,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":144},"git-cheatsheet","\u002Fposts\u002Fgit-cheatsheet","Git 常用操作备忘","2026-04-05 14:00:00",[2025,2026],"Git","工具",{"slug":2028,"path":2029,"title":2030,"date":2031,"tags":2032,"description":47,"draft":1753,"hidden":1753,"published":164,"readingTime":161},"github-actions-intro","\u002Fposts\u002Fgithub-actions-intro","GitHub Actions 入门：自动化你的工作流","2026-04-04 09:00:00",[2033,2034,2035],"GitHub Actions","CI\u002FCD","自动化",1782796012366]