题意:

image.png

解题思路:

  1. 思路:双指针遍历:O(n)
  2. 1. 首先定义虚拟元素dummy指向链表头节点
  3. 2. 从前往后扫描,遇到区间段相同的元素则直接删除;
  4. 3. 调整指针指向,最后返回dummy->next

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param ListNode $head
  4. * @return ListNode
  5. */
  6. function deleteDuplicates($head) {
  7. return $this->deleteDuplicates1($head);
  8. if (!$head) return null;
  9. $dummy = new ListNode(0);
  10. $dummy->next = $head;
  11. $p = $dummy;
  12. //1->2->3->3->3->4->4->5
  13. while ($p->next && $p->next->next) {
  14. if ($p->next->val == $p->next->next->val) {
  15. $num = $p->next->val;
  16. //出现3个3的情况,指针继续往后找,直到下个元素不等
  17. while ($p->next && $p->next->val == $num) {
  18. $p->next = $p->next->next;
  19. }
  20. } else {
  21. $p = $p->next;
  22. }
  23. }
  24. return $dummy->next;
  25. }
  26. function deleteDuplicates1($head) {
  27. $dummy = new ListNode(0);
  28. $dummy->next = $head;
  29. $prev = $dummy;
  30. $cur = $prev->next;
  31. while ($cur != null) {
  32. while ($cur->next != null && $cur->val == $cur->next->val) {
  33. $cur = $cur->next;
  34. }
  35. if ($prev->next != $cur) {
  36. $prev->next = $cur->next;
  37. } else {
  38. $prev = $prev->next;
  39. }
  40. $cur = $prev->next;
  41. }
  42. return $dummy->next;
  43. }
  44. }

GO代码实现:

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func deleteDuplicates(head *ListNode) *ListNode {
  9. if head == nil {
  10. return nil
  11. }
  12. dummy := &ListNode {
  13. Val : -1,
  14. Next : head,
  15. }
  16. p := dummy
  17. for p.Next != nil && p.Next.Next != nil {
  18. if p.Next.Val == p.Next.Next.Val {
  19. num := p.Next.Val
  20. for p.Next != nil && p.Next.Val == num {
  21. p.Next = p.Next.Next
  22. }
  23. } else {
  24. p = p.Next
  25. }
  26. }
  27. return dummy.Next
  28. }