21. Merge Two Sorted Lists。
题目要求是合并两个有序链表。
我的解法是对于两个给定的链表,将第二个链表插入到第一个链表中。代码如下:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* q) {
ListNode* p = l1 ;
ListNode* t ;
if(p == NULL && q == NULL) {
return NULL ;
} else if (p==NULL && q!=NULL) {
return q ;
} else if (p!=NULL && q==NULL) {
return p ;
} else {
while(p != NULL && q!=NULL) {
ListNode* tmp = q->next ;
if(q->val < p->val) {
q->next = p ;
if(l1 == p) {
t = q ;
l1 = t ;
} else {
t->next = q ;
t = t->next ;
}
q = tmp ;
} else {
if(p->next==NULL || q->val <= p->next->val) {
q->next = p->next ;
p->next = q ;
p = p->next ;
q = tmp ;
} else {
p = p->next ;
}
}
}
}
return l1 ;
}
};
后来看了优秀的解法,发现可以将两个链表合并到一个新的链表中,所以有重写了一遍,代码如下:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(-1) ;
ListNode* pr = head ;
while(l1!=NULL && l2!=NULL) {
if(l1->val <= l2->val) {
pr->next = l1 ;
l1 = l1->next ;
} else {
pr->next = l2 ;
l2 = l2->next ;
}
pr = pr->next ;
}
if(l1!=NULL && l2==NULL) {
pr->next = l1 ;
} else if(l1==NULL && l2!=NULL) {
pr->next = l2 ;
} else {
pr->next = NULL ;
}
return head->next ;
}
};
26. Remove Duplicates from Sorted Array
题目意思是从有序数组中移除重复元素,并返回最后数组中的元素个数,同时最后数组中的元素是唯一的。题目要求不能使用额外的空间。
我的解法是使用了C++中vector的erase删除元素的函数来实现。代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size() == 0)
return 0 ;
for(int i=0; i<nums.size()-1; ++i) {
if(nums[i+1] == nums[i]) {
nums.erase(nums.begin()+i) ;
-- i ;
}
}
return nums.size() ;
}
};
第二种解法是使用了vector中的去重函数来实现,代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
vector<int>::iterator it = unique(nums.begin(),nums.end()) ;
if(it!=nums.end()) {
nums.erase(it,nums.end()) ;
}
return nums.size() ;
}
};