83. Remove Duplicates from Sorted List(删除排序链表中的重复元素)
题目上说给出了一个已经排好序的链表的头结点,删除重复的元素来让每个元素只出现一次,然后将链表返回。
在此问题中,只需要会链表的删除操作就行了。
struct ListNode* deleteDuplicates(struct ListNode* head) {
struct ListNode *p,*q;
p = head;
if(p!=NULL){
q = head->next;
while(q!=NULL){
if(q->val==p->val){
p->next = q->next;
free(q);
q = p->next;
}else{
p = p->next;
q = q->next;
}
}
}
return head;
}
运行结果截图:

88. Merge Sorted Array(合并两个有序数组)
给出了两个按照非递减顺序排列的整型数组nums1和nums2,和分别代表nums1于nums2元素个数的两个整型数m和n。
将nums1和nums2按照非递减顺序合并成一个数组。
最终排序好的数组不应该由函数返回而是存储在nums1中,为了容纳这种情况,nums1数组长度为m+n,其中m指的是nums1中应被合并的元素,后一个n代表的是应被忽略的0。nums2的长度为n。
因为直接在num1上进行排序,可能会导致元素的大量移动,这样就要花费大量的操作去移动元素,为了避免这种情况,我们可以先分配一个m+n大小的空间,先把nums1与nums2排好,然后再把元素复制到nums1,这样就避免了可能的大量元素的移动。但是这样的话还是有点不妥,我们是不是可以先把nums1元素复制之后,再在nums1上进行排序,这样是不是更省空间和时间。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int *sort = (int *)malloc(sizeof(int)*(m+1));
for(int x=0; x<m; x++){
sort[x] = nums1[x];
}
int i=0,j=0,k=0;
while(i!=m&&j!=n){
if(sort[i]<nums2[j]){
nums1[k++] = sort[i++];
}else{
nums1[k++] = nums2[j++];
}
}
while(i!=m){
nums1[k++] = sort[i++];
}
while(j!=n){
nums1[k++] = nums2[j++];
}
}
1万+



被折叠的 条评论
为什么被折叠?



