1. 程式人生 > 其它 >2.刪除排序連結串列中的重複元素

2.刪除排序連結串列中的重複元素

題目描述

存在一個按升序排列的連結串列,給你這個連結串列的頭節點head,請你刪除所有重複的元素,使每個元素只出現一次。
返回同樣按升序排列的結果連結串列。

樣例

輸入:1->1->2
輸出:1->2

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

演算法

線性掃描O(n)
自己的想法

連結串列中是升序排序的,所以使用兩個指標進行掃描是合適的

/**
 * Definition for singly-linked list.
 * 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) {
            if (!head || !head->next) {
                return head;
            }

            ListNode* f = head;
            ListNode* s = f->next;
            
            while (s->next) {
                if (f->val == s->val) {
                    f->next = s->next;
                    s = s->next;
                } else if (f->val < s->val) {
                    f = s;
                    s = s->next;
                }
            }

            // 特別的判斷,判斷最後兩個數,如果兩個數相等,那麼就去掉其中的一個數;如果兩個數不等,就不動
            if (!s->next && s->val == f->val) {
                f->next = s->next;
            }
            return head;
        }
};