2020/9/15 美团面试两道链表题

2020/9/15 美团面试两道链表题_第1张图片

双指针技巧:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummy = new ListNode(-1);
        dummy->next = head;
        ListNode* p = dummy;
        while(p&&p->next){
            ListNode* q = p->next;
            while(q&&q->val==val) q=q->next;
            p->next = q;
            p = p->next;
        }
        return dummy->next;
    }
};

 

2020/9/15 美团面试两道链表题_第2张图片

 

这道题目略有难度,要把所有的都删除,而不是保留一个,思路是:通过一个if判断来判断是否重复。

2020/9/15 美团面试两道链表题_第3张图片

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* dummy = new ListNode(-1);
        dummy->next = head;
        ListNode* p = dummy;
        while(p&&p->next){
            ListNode* q = p->next->next;
            while(q&&q->val==p->next->val) q = q->next;
            if(p->next->next==q) p = p->next;
            else p->next = q;
        }
        return dummy->next;
    }
};

 

 

双指针技巧

2020/9/15 美团面试两道链表题_第4张图片

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==NULL) return head;
        ListNode* p = head->next, *q = head;
        while(p){
            while(p&&p->val==q->val) p = p->next;
            q->next = p;
            q = q->next;
            if(p!=NULL) p = p->next;
        }
        return head;
    }
};

 

你可能感兴趣的:(算法)