41.日常算法
- IT业界
- 2025-09-07 05:21:02

1.面试题 02.04. 分割链表
题目来源 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你不需要 保留 每个分区中各节点的初始相对位置。
示例 1: 输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5]
方法一——模拟
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* partition(ListNode* head, int x) { if (head == nullptr) return nullptr; ListNode* minx = new ListNode; ListNode* maxx = new ListNode; ListNode* cur = head; ListNode* curmin = minx; ListNode* curmax = maxx; while (cur){ if (cur->val < x){ curmin->next = cur; curmin = curmin->next; }else{ curmax->next = cur; curmax = curmax->next; } cur = cur->next; } curmin->next = nullptr; curmax->next = nullptr; curmin->next = maxx->next; return minx->next; } };方法二——双指针+交换
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* partition(ListNode* head, int x) { ListNode* left = head; ListNode* right = head; while (right){ if (right->val < x){ std::swap(left->val, right->val); left = left->next; } right = right->next; } return head; } }; 2.将有序数组转换为二叉搜索树题目来源 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。
示例 1: 输入:nums = [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: TreeNode * createBTree(TreeNode *&root, vector<int>& nums, int left, int right){ if (left > right) return nullptr; int mid = (right - left) / 2 + left; root = new TreeNode(nums[mid]); root->left = createBTree(root->left, nums, left, mid - 1); root->right = createBTree(root->right, nums, mid + 1, right); return root; } TreeNode* sortedArrayToBST(vector<int>& nums) { TreeNode* root = nullptr; createBTree(root, nums, 0, nums.size() - 1); return root; } };上一篇
机器学习(四)
下一篇
介绍两本学习智谱大模型的入门图书