82.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package main
  2. // ListNode ...
  3. /* type ListNode struct {
  4. Val int
  5. Next *ListNode
  6. } */
  7. /* func list2str(head *ListNode) string {
  8. curr := head
  9. str := make([]rune, 0)
  10. for curr != nil {
  11. str = append(str, rune(curr.Val+'0'))
  12. curr = curr.Next
  13. }
  14. return string(str)
  15. } */
  16. /**
  17. * Definition for singly-linked list.
  18. * type ListNode struct {
  19. * Val int
  20. * Next *ListNode
  21. * }
  22. */
  23. func deleteDuplicates(head *ListNode) *ListNode {
  24. if head == nil || head.Next == nil {
  25. return head
  26. }
  27. dummy := ListNode{0, head}
  28. slow := &dummy
  29. fast := slow.Next
  30. for fast != nil {
  31. if fast.Next == nil || fast.Next.Val != slow.Next.Val {
  32. // duplicates end
  33. if slow.Next != fast {
  34. // cut dup
  35. slow.Next = fast.Next
  36. fast = fast.Next
  37. // do not move ptr in case of fast maybe nil
  38. continue
  39. }
  40. // no duplicates, move both slow & fasr
  41. slow = slow.Next
  42. }
  43. // if has dup, move fast only
  44. fast = fast.Next
  45. }
  46. return dummy.Next
  47. }
  48. /* func main() {
  49. l15 := ListNode{5, nil}
  50. l14 := ListNode{5, &l15}
  51. l13 := ListNode{4, &l14}
  52. l12 := ListNode{3, &l13}
  53. l1 := &ListNode{1, &l12}
  54. fmt.Println(list2str(deleteDuplicates(l1)))
  55. fmt.Println(list2str(deleteDuplicates(nil)))
  56. } */