82.go 1.2 KB

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