leetcode刷题日记:83. Remove Duplicates from Sorted List(删除排序链表中的重复元素)和88. Merge Sorted Array(合并两个有序数组)

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;
}

运行结果截图:
leetcode刷题日记:83. Remove Duplicates from Sorted List(删除排序链表中的重复元素)和88. Merge Sorted Array(合并两个有序数组)_第1张图片

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++];
    }
}

你可能感兴趣的:(leetcode刷题日记,leetcode,list,链表)