题目:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving onlydistinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5
, return 1->2->5
.
Given 1->1->1->2->3
, return 2->3
.
题意:
给定一个排序好的链表,删除所有重复的节点,剩下值完全不相同的节点。
思路一:
递归实现,依次删除重复的节点,不重复得节点依次递归。
代码:8ms
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* deleteDuplicates(ListNode* head) { if(!head || !head->next) return head; ListNode *p = head->next; if(head->val == p->val) { while(p && head->val == p->val) { ListNode *tmp = p; p = p->next; delete tmp; } delete head; return deleteDuplicates(p); } else { head->next = deleteDuplicates(head->next); return head; } } };思路二:
迭代实现,定义两个指针,遇到相同节点时,删除相同节点,并将删除节点之后的部分连接到前面不同的节点链上。
代码:8ms
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* deleteDuplicates(ListNode* head) { if (head == nullptr) return head; ListNode dummy(INT_MIN); dummy.next = head; ListNode *prev = &dummy, *cur = head; while (cur != nullptr) { bool duplicated = false; while (cur->next != nullptr && cur->val == cur->next->val) { duplicated = true; ListNode *temp = cur; cur = cur->next; delete temp; } if (duplicated) { ListNode *temp = cur; cur = cur->next; delete temp; continue; } prev->next = cur; prev = prev->next; cur = cur->next; } prev->next = cur; return dummy.next; } };