LeetCode //C - 82. ソートされたリストから重複を削除 II

82. ソート済みリストから重複を削除 II

ソートされたリンク リストの先頭を指定して、重複する番号を持つすべてのノードを削除し、元のリストから異なる番号だけを残しますリンクされたリストもソートして返します。
 

例 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
  • リストは昇順にソートされることが保証されています。

From: LeetCode
Link: 82. ソート済みリストから重複を削除 II


解決:

アイデア:

1. ポインターとダミー ノードを初期化します。

  • 新しいリストのプレースホルダーとして機能するダミー ノードを作成します。prev をこのダミー ノードに初期化し、curr を元のリストの先頭に初期化します。

2. 元のリストを調べます。

  • curr ポインターを使用して、リスト内の各ノードを移動します。

3. 重複をチェックします。

  • curr ノードに重複がある場合 (つまり、curr->val が curr->next->val と同じ)、curr を最後の重複ノードに移動します。これは、メインの while ループ内の while ループを使用して行われます。

4. 新しいリストに一意のノードを追加します。

  • 現在のノードが重複していない場合は、新しいリストに追加します。prev ポインターは、新しいリストに追加された最後のノードを追跡します。

5. 次のノードに移動します。

  • curr を元のリストの次のノードに移動します。

6. 新しいリストを終了します。

  • 新しいリストの最後のノードの次を必ず NULL に設定してください。

7. 新しいリストを返します:

  • 新しいリストはダミー ノードの後に​​始まります。したがって、リストの新しい先頭として dummy->next を返します。
コード:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* deleteDuplicates(struct ListNode* head) {
    
    
    // Create a dummy node to serve as the head of the new list
    struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
    dummy->val = 0;
    dummy->next = NULL;
    
    // Initialize pointers
    struct ListNode* prev = dummy;
    struct ListNode* curr = head;
    
    while (curr != NULL) {
    
    
        // Check if the current node is a duplicate
        int duplicate = 0;
        while (curr->next != NULL && curr->val == curr->next->val) {
    
    
            duplicate = 1;
            curr = curr->next;
        }
        
        // If it's not a duplicate, add it to the new list
        if (duplicate == 0) {
    
    
            prev->next = curr;
            prev = curr;
        }
        
        // Move to the next node in the original list
        curr = curr->next;
    }
    
    // Terminate the new list
    prev->next = NULL;
    
    // Return the new list (skipping the dummy node)
    struct ListNode* newHead = dummy->next;
    free(dummy);
    return newHead;
}

おすすめ

転載: blog.csdn.net/navicheung/article/details/132574621