LeetCode—86(分隔链表)
方法:我们可以利用一个新链表保存比x小的,这样原链表就剩下比x大于等于的,随后将原链表接在新链表后面即可。
C++代码:
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if(!head) return head;
ListNode *dummy = new ListNode(-1);
ListNode *newdummy = new ListNode(-1);
dummy -> next = head;//接上原链表
ListNode *cur = dummy,*p = newdummy;
while(cur -> next){
if(cur->next->val < x){
p -> next = cur -> next;
p = p -> next;
cur -> next = cur -> next -> next;
p -> next = NULL;//不太明白
}else{
cur = cur -> next;//大于等于的情况直接跳过
}
}
p -> next = dummy -> next;
return newdummy -> next;
}
};
LeetCode—87(扰乱字符串)
跳过
LeetCode—88(合并两个有序数组)
方法:我们就从nums1和nums2数组的末尾开始一个一个比较,把较大的数,按顺序从后往前加入混合之后的数组末尾。需要三个变量i,j,k,分别指向nums1,nums2,和混合数组的末尾。具体看代码
C++代码:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m-1,j = n-1,k = m+n-1;//k为合并数组的尾索引
while(i>=0 && j>=0){
if(nums1[i] > nums2[j]) nums1[k--] = nums1[i--];
else nums1[k--] = nums2[j--];
}
//当nums2剩余的都小于nums[1]时,将剩下的全部加入(重要)
while(j>=0){
nums1[k--] = nums2[j--];
}
}
};
LeetCode—89(格雷编码)
LeetCode—90(子集)
方法:此题与78相似,但是此题数组包含重复元素。加上条件while(i+1 < nums.size() && nums[i] == nums[i+1]) i++;//重复则跳过,与上一题的区别。
C++代码:
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> res;
vector<int> out;
sort(nums.begin(),nums.end());
helperDFS(nums,0,out,res);
return res;
}
void helperDFS(vector<int>& nums,int level,vector<int>& out,vector<vector<int>>& res){
res.push_back(out);
for(int i = level;i < nums.size();i++){
out.push_back(nums[i]);
helperDFS(nums,i+1,out,res);
out.pop_back();
while(i+1 < nums.size() && nums[i] == nums[i+1]) i++;//重复则跳过,与上一题的区别
}
}
};