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;
}