今天練習 pointer to pointer 的寫法前,先練習了 你所不知道的 C 語言: linked list 這篇裡提供的 LeetCode 21. Merge Two Sorted Lists 的解法邏輯
題目敘述:
給一個排序好的鍊結串列的首節點,刪除所有具有重複數字的節點,只留下與原始清單不同的數字。傳回已排序的鍊結串列。
題目提供的輸入輸出:
Input: head = [1,2,3,3,4,4,5]
Output: [1,2,5]
解題:ptr2ptr
為確定 unique node 後要接的位置。如果目前 *ptr2ptr
不是 unique node 那就將此位置跳掉。反之,如果是 unique node ,那就保留,即是將 ptr2ptr
移到下一個位置。
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *dummy = new ListNode(-101, head), **ptr2ptr = &(dummy->next) ;
int preV = -101;
for (ListNode *n = *ptr2ptr; n; preV = n->val, n = *ptr2ptr) {
if (preV == n->val || (n->next && n->val == n->next->val)) { // skip
*ptr2ptr = n->next;
} else { // concatenat
ptr2ptr = &n->next;
}
}
return dummy->next;
}
};
時間複雜度 O(N), N 為鍊結串列的節點數
p.s. 此程式碼會有 memory leak的問題啊