LeetCode链表OJ题目 代码+思路分享

删除有序数组中的重复项

链接: link
题目描述:
u
题目思路:

本题使用两个指针dst和src一前一后
在这里插入图片描述
相同情况:
如果nums[dst]=nums[src],那么src++
在这里插入图片描述
不相同情况:
此时nums[dst]=nums[src]:
1.我们先让src++
2.接着将nums[dst]=nums[src]
3.src++
在这里插入图片描述
按照此思路依次向后,我们最终会得到这样的一个结果
此时删除后数组的元素个数是dst+1在这里插入图片描述

代码实现:

int removeDuplicates(int* nums, int numsSize)
{
   int dst = 0;
   int src = 1;
   while(src<numsSize)
   {
       if(nums[dst]==nums[src])
       {
           src++;
       }
       else
       {
           dst++;
           nums[dst]=nums[src];
           src++;
       }
   }
   return dst+1;
}

合并两个有序数组

链接: link
题目描述:
在这里插入图片描述
题目思路:

在这里插入图片描述

end1和end2指向的元素进行对比,将值最大的元素放在end指向的位置,如果end1的元素最大,则end1–,end–,如果end2的元素最大,则end2–,end–。
进行第一次对比,结果如下:
在这里插入图片描述
第二次
在这里插入图片描述
第三次
在这里插入图片描述
这里是第二个数组走到了最后,所以说数组就成功合并结束。
如果是第二个数组没有走到最后呢?
如果第二个数组剩余元素,那么直接将第二个数组的元素依次放在第一个数组相应的位置,完成合并。

代码实现:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int end1 = m-1;
    int end2 = n-1;
    int end = m+n-1;
    while(end1>=0&&end2>=0)
    {
        if(nums2[end2]>nums1[end1])
        {
            nums1[end--]=nums2[end2--];
        }
        else
        {
            nums1[end--]=nums1[end1--];
        }
    }
    while(end2>=0)
    {
        nums1[end--]=nums2[end2--];
    }
   
}

移除链表元素

链接: link
题目描述:
在这里插入图片描述
题目思路:

首先我们对这道题的思考是前后两个节点指针,进行删除节点的操作
我们这里设定cur指向的节点是要被删除的节点在这里插入图片描述
1、如果cur->val不是我们所想要删除的节点值,那么就做下面操作:
prev=cur ,cur=cur->next,继续向下遍历链表,寻找我们要删除的那个节点。
在这里插入图片描述
2、如果此时cur->val是我们想要删除的值,我们就要判断prev空指针的问题了,为什么呢?这里解释一下
如果说链表开始头节点就是6,那么头节点就是我们要删除的节点,这里prev就是空指针,就是下面的情况:
在这里插入图片描述
这里我们要做的操作是:cur=head->next,free(head),head = cur删除头节点元素后,将cur赋值成新的头。
3、如果此时cur->val是我们想要删除的值,并且是下面的情况,那么这种就不是空指针问题:
在这里插入图片描述
这里我们需要做的操作就是:prev->next = cur->next,free(cur),cur=prev->next

代码实现:

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    while(cur)
    {
        if(cur->val==val)
        {
            if(prev!=NULL)
            {
                prev->next = cur->next;
                free(cur);
                cur=prev->next;
            }
            else
            {
                cur = head->next;
                free(head);
                head = cur;
            }
        }
        else
        {
            prev=cur;
            cur=cur->next;
        }
    }
    return head;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mikk-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值