LeetCode | Remove Duplicates from Sorted List II

100 篇文章 0 订阅
13 篇文章 0 订阅

这道题一开始以为是双指针问题…

Given a sorted linked list, delete all nodes that have duplicate
numbers, leaving only distinct numbers from the original list.

For example, Given 1->2->3->3->4->4->5, return 1->2->5. Given
1->1->1->2->3, return 2->3.

改了若干bug之后提交发现不对….
这个是要求把重复的全部删除…
于是思想就是:利用双指针c1,c2,c1始终在c2后,通过判断c2->val==c2->next->val来决定,此时用另一指针,一直找到不等的那个数为止~~
于是那个节点p赋值给c1->next,就可以跳过所有等值的c2

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==NULL) return head;
        //显然,肯定是利用和数组类似的双指针
        ListNode root(-1);
        root.next=head;
        ListNode* c1;
        ListNode* c2;
        c1=&root;
        c2=c1->next;
        if(c2==NULL) return root.next;

        int flag=0;
        for(;c2!=NULL;){
            if(c2->next!=NULL && c2->val==c2->next->val){
                //一直找到不相等的那个p节点
                ListNode *p=c2->next;
                while(p!=NULL && p->val==c2->val) p=p->next;
                //删除所有c2
                c1->next=p;
                c2=p;
            }
            else{
                c1=c1->next;
                c2=c2->next;
            }
        }
        // c1->next=NULL;
        return root.next;
    }
};

嗯,终于没看题解搞定了
然后上一道题其实是要求只留一个的,那就比较简单了,贴代码。和数组的双指针的很像

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==NULL) return head;
        ListNode root(head->val-1);
        //不要忘了这一步,将root链接到head上
        root.next=head;

        ListNode *c1;
        ListNode *c2;
        c1=&root;
        c2=c1->next;

        for(;c2!=NULL;c2=c2->next){
            if(c1->val==c2->val){
                c1->next=c2->next;
            }
            else c1=c1->next;
        }

        return root.next;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值