LeetCode-82. 删除排序链表中的重复元素 II

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

 

示例 1:


输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:


输入:head = [1,1,1,2,3]
输出:[2,3]

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列

 

方法有很多种哈,个人采用栈的方法拿到非重复元素,然后使用尾插法构造链表

#include<iostream>
#include <stack>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution {
public:
    /* 利用栈求出不重复的链表节点 */
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* nhead;
        ListNode* nTmp = head;
        bool isSame = false;   /* 用于判断是否有相同元素 */
        while (nTmp != NULL) {
            /* 每次与栈顶比较,相同的话节点移动到下一个节点 */
            if (!m_stack.empty() && m_stack.top() == nTmp->val) {
                nTmp = nTmp->next;
                isSame = true;
                continue;
            }
            else {
                /* 有相同元素,pop栈顶 */
                if (isSame && !m_stack.empty()) {
                    m_stack.pop();
                    isSame = false;
                }
                m_stack.push(nTmp->val);
            }
            nTmp = nTmp->next;
        }

        /* 最后一次跳出循环,栈顶有相同,仍然需要pop */
        if (isSame && !m_stack.empty()) {
            m_stack.pop();
            isSame = false;
        }

        return constructList();
    }

    /* 采用尾插法 */
    ListNode* constructList() {
        ListNode* tailNode = NULL;

        while (!m_stack.empty()) {
            ListNode* node = new ListNode(m_stack.top());
            node->next = tailNode;
            tailNode = node;
            m_stack.pop();
        }
        return tailNode;
    }

private:
    stack<int> m_stack;
};

int main() {

    ListNode* head = new ListNode(1);
    ListNode* node1 = new ListNode(2);
    ListNode* node2 = new ListNode(3);
    ListNode* node3 = new ListNode(3);
    ListNode* nodeT = new ListNode(3);
    ListNode* node4 = new ListNode(4);
    ListNode* node5 = new ListNode(4);
    ListNode* node6 = new ListNode(5);
    ListNode* node7 = new ListNode(5);
    head->next = node1;
    node1->next = node2;
    node2->next = node3;
    node3->next = nodeT;
    nodeT->next = node4;
    node4->next = node5;
    node5->next = node6;

    Solution* ps = new Solution();
    ListNode* node = ps->deleteDuplicates(head);
    while (node!= NULL) {

        cout << node->val << endl;
        node = node->next;
    }

    system("pause");
    return 0;
}

 


版权声明:本文为qq_16542775原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。