leetCode 83&82. 删除排序链表中的重复元素

81. 删除排序链表中的重复元素

题目描述:

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:

输入: 1->1->2
输出: 1->2

示例 2:

输入: 1->1->2->3->3
输出: 1->2->3

思路:使用两个相邻的指针,如果后面的指针的数值和前面的指针相同,那么删除后面的指针指向的节点,然后继续比较前面指针指向的值和后面指针指向的值。如果说两个指针指向的值不同,那么两个指针都要向后移一位。

代码:

/**
 * 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 || head->next==NULL)
            return head;
        
        ListNode* p1=head;
        ListNode* p2=head->next;
        while(p2){
            if(p1->val==p2->val){
                ListNode* p=p2;
                p1->next=p2->next;
                free(p);
                p2 = p2->next;
            }
            else{
                p1=p1->next;
                p2=p2->next;
            }
        }
        
        return head;
    }
};

82. 

题目描述:

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

思路:这道题需要把重复的值都删了。解题思路还是使用两个相邻指针p1和p2,如果p1和p2指向的值相同,那么p2继续往前走,知道找到不相同的值,这样区间p1和p2之间的就都是相同的数了,然后从p1开始删除这些重复的值,一直删除到p2,然后p1指向p2的位置,p2继续往前走。如果说p1和p2不相同,那么就都继续往前走。这里需要注意的是,在实现的时候,需要始终有一个节点指向p1前面的位置,这样才能删除。所以,一个编程tips:可以新建一个节点指向头节点,然后定义一个指针始终在p1之前即可。

代码:

/**
 * 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 || head->next==NULL)
            return head;
        
        ListNode* p1=head;
        ListNode* p2=head->next;
        ListNode* tempHead=new ListNode(-1);
        tempHead->next=head;
        ListNode* pre=tempHead;
        while(p2){
            if(p1->val==p2->val){
                p2=p2->next;   
            }
            else{//判断是否需要删除
                if(p1->next != p2){
                    while(p1!=p2){
                        ListNode* p=p1;
                        pre->next=p1->next;
                        free(p);
                        p1=pre->next;
                    }
                    p2=p2->next;
                }
                else{//不需要删除
                    pre=pre->next;
                    p1=p1->next;
                    p2=p2->next;
                }
            }
            
        }
        
        if(p2==NULL && p1->next!=p2){
            while(p1!=p2){
                ListNode* p=p1;
                pre->next=p1->next;
                free(p);
                p1=pre->next;
            }
        }
        
        return tempHead->next;
    }
};

猜你喜欢

转载自blog.csdn.net/sinat_15723179/article/details/81119542