题目描述
在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留。
样例
Input: 链表: 1->2->3->3->4->4->5
Output: 新链表:1->2->5
解题思路
-
描述
使用一个指针pre指示一个节点,用另外一个节点p指示pre->next->val != p->val,然后调整指向即可。
pre和p两者之间的节点为值相等的节点。
-
实现代码:
/* struct ListNode { int val; ListNode* next; } */ void deleteDuplication(ListNode* head) { ListNode* pre = head, *p = head->next; while (pre->next) { while (p && (pre->next->val == p->val)) { p = p->next; //跳过值重复的节点 } if (pre->next->next == p) // pre和p之间仅有一个节点 { pre = pre->next; } else // pre和q之间存在若干节点 { pre->next = p; } } }
-
复杂度分析
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 0 ) O(0) O(0)