1.给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *front, *back;
front = back = head;
int gapN = 0;
while(back != NULL){
back = back->next;
if(gapN++ > n)
front = front->next;
}
if(gapN <= n)
return head->next;
if(gapN == 1){
front->next = NULL;
return head;
}
front->next = front->next->next;
return head;
}
};
2.给出一个区间的集合,请合并所有重叠的区间。
void quicksort(std::vector<std::vector<int>> &intervals, int start, int end)
{
int i, j;
std::vector<int> temp;
if (start > end)
{
return;
}
temp = intervals[start];
i = start;
j = end;
while (i != j)
{
while (i < j && intervals[j][0] >= temp[0])
{
j--;
}
while (i < j && intervals[i][0] <= temp[0])
{
i++;
}
if (i < j)
{
std::vector<int> tmp = intervals[i];
intervals[i] = intervals[j];
intervals[j] = tmp;
}
}
intervals[start] = intervals[i];
intervals[i] = temp;
quicksort(intervals, start, i - 1);
quicksort(intervals, i + 1, end);
}
std::vector<std::vector<int>> merge(std::vector<std::vector<int>>& intervals)
{
if (intervals.empty())
return intervals;
std::vector<std::vector<int>> mergeVec;
quicksort(intervals, 0, intervals.size() - 1);
mergeVec.push_back(*intervals.begin());
for (size_t i = 1; i < intervals.size(); i++)
{
if (intervals.at(i)[0] > mergeVec.at(mergeVec.size() - 1)[1]) {
mergeVec.push_back(intervals.at(i));
continue;
}
if (mergeVec.at(mergeVec.size() - 1)[1] < intervals.at(i)[1])
mergeVec.at(mergeVec.size() - 1)[1] = intervals.at(i)[1];
}
return mergeVec;
}
3.给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
void sortColors(std::vector<int>& nums)
{
if (nums.size() < 2)
return;
int left = 0, right = nums.size() - 1;
for (size_t i = 0; i <= right; i++)
{
if (nums[i] == 0) {
nums[left++] = 0;
}
else if (nums[i] == 2) {
while (i < right && nums[right] == 2)
right--;
if (i == right) return;
if (nums[right] == 0)
nums[left++] = 0;
nums[right--] = 2;
}
if (left != i + 1)
nums[i] = 1;
}
}
//这里的三路快排思想需要好好梳理一下