难度困难
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6
示例 2:
输入:lists = [] 输出:[]
示例 3:
输入:lists = [[]] 输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列lists[i].length
的总和不超过10^4
class Solution {
public:
static bool fun (const ListNode* l1,const ListNode* l2)
{
return l1->val < l2->val;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.size() == 0) return NULL;
vector<ListNode*> v_L;
for(auto L1: lists)
{
while(L1 != NULL)
{
v_L.push_back(L1);
L1 = L1->next;
}
}
if (v_L.size() == 0) return NULL;
sort(v_L.begin(),v_L.end(),fun);
int len = v_L.size()-1;
for(int i = 0; i < len; i++)
{
v_L[i]->next = v_L[i+1];
}
v_L[len]->next = NULL;
return v_L[0];
}
};
难度简单
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为1
,2
。 你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为0
,1
,2
,3
,4
。 你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); }
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(!nums.size())return 0;
int current=0;
for(int i=1;i<nums.size();i++)
{
if(nums[current]<nums[i])
{
nums[current+1]=nums[i];
current++;
}
}
return current+1;
}
};
难度中等
升序排列的整数数组 nums
在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7]
经旋转后可能变为 [4,5,6,7,0,1,2]
)。
请你在数组中搜索 target
,如果数组中存在这个目标值,则返回它的索引,否则返回 -1
。
示例 1:
输入:nums = [4,5,6,7,0,1,2]
, target = 0
输出:4
示例 2:
输入:nums = [4,5,6,7,0,1,2]
, target = 3
输出:-1
示例 3:
输入:nums = [1], target = 0 输出:-1
提示:
1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
nums
中的每个值都 独一无二nums
肯定会在某个点上旋转-10^4 <= target <= 10^4
class Solution {
public:
int find(vector<int>& nums,int target,int left,int right){
int mid=(left+right)/2;
while(left<=right){
if(nums[mid]<target){
left=mid+1;
}else if(nums[mid]>target){
right=mid-1;
}else{
return mid;
}
mid=(left+right)/2;
}
return -1;
}
int search(vector<int>& nums, int target) {
int n=nums.size();
if(n==0) return -1;
if(n<=2){
for(int i=0;i<n;++i){
if(nums[i]==target) return i;
}
return -1;
}
int pos=1;
int ans=0;
int left=0,right=n-1;
int mid=(left+right)/2;
int preleft=0,tmp;
while(left<=right){
if(mid==0)break;
if(nums[mid]<nums[mid-1]){
pos=mid;
break;
}else if(nums[mid]<nums[n-1]){
right=mid-1;
}else{
left=mid+1;;
}
mid =(left+right)/2;
}
left=0;right=pos-1;
ans=max(find(nums,target,0,pos-1),find(nums,target,pos,n-1));
return ans;
}
};