LeetCode – Remove Duplicates from Sorted List II (Java)
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct 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.
解题思路:
对比I,这道题要求不保留任何重复的节点。所以需要一个index记录当前已经保留的节点的末端,然后用另一个节点去遍历,并在这个过程中对重复值和新值进行处理。
难点在于对corner cases的处理。刚开始刷题不久,还没有养成预先写test的习惯,所以在这些特例上,花了很多时间。
Corner Case:[1,2,2],[0,1,2,2,3,4],[1,1],[1],[1,1,2,2]
1 public static ListNode deleteDuplicates(ListNode head){ 2 if(head!=null){ 3 ListNode c1 = new ListNode(head.val-1); 4 c1.next = head; 5 ListNode re = c1, c2 = head; 6 int count = 0, temp = c1.next.val; 7 8 while(c2!=null){ 9 if(temp!=c2.val && count>1){ 10 c1.next = c2; 11 temp = c2.val; 12 count = 1; 13 }else if(temp!=c2.val && count==1){ 14 c1 = c1.next; 15 temp = c2.val; 16 count = 1; 17 }else 18 count ++; 19 c2 = c2.next; 20 21 } 22 if(count > 1) c1.next = null; 23 return re.next; 24 25 } 26 return null; 27 }
另外还有一个code更简洁的版本出自Programcreek,贴出来给大家参考。 http://www.programcreek.com/2014/06/leetcode-remove-duplicates-from-sorted-list-ii-java/
1 public static ListNode deleteDuplicates(ListNode head){ 2 ListNode t = new ListNode(0); 3 t.next = head; 4 ListNode p = t; 5 6 while(p.next!=null && p.next.next!=null){ 7 if(p.next.val == p.next.next.val){ 8 int dup = p.next.val; 9 while(p.next!=null && p.next.val==dup){ 10 p.next = p.next.next; 11 } 12 }else 13 p=p.next; 14 } 15 return t.next; 16 } 17

浙公网安备 33010602011771号