package main // ListNode ... /* type ListNode struct { Val int Next *ListNode } */ /* func list2str(head *ListNode) string { curr := head str := make([]rune, 0) for curr != nil { str = append(str, rune(curr.Val+'0')) curr = curr.Next } return string(str) } */ /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func deleteDuplicates(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } dummy := ListNode{0, head} slow := &dummy fast := slow.Next for fast != nil { if fast.Next == nil || fast.Next.Val != slow.Next.Val { // duplicates end if slow.Next != fast { // cut dup slow.Next = fast.Next fast = fast.Next // do not move ptr in case of fast maybe nil continue } // no duplicates, move both slow & fasr slow = slow.Next } // if has dup, move fast only fast = fast.Next } return dummy.Next } /* func main() { l15 := ListNode{5, nil} l14 := ListNode{5, &l15} l13 := ListNode{4, &l14} l12 := ListNode{3, &l13} l1 := &ListNode{1, &l12} fmt.Println(list2str(deleteDuplicates(l1))) fmt.Println(list2str(deleteDuplicates(nil))) } */