題目:
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2
, return 1->2
.
Given 1->1->2->3->3
, return 1->2->3
.
題解:
這道題是經典的雙指標問題,用兩個指標一前一後指向連結串列。如果兩個指標指向的值相等,那麼就讓第二個指標一直往後挪,挪到與第一個指標不同為止。然後讓第一個指標的next指向第二個指標,兩個指標同時往後挪,進行下面的操作。
需要注意,當list的結尾幾個node是重複的時候,例如1->2->3->3,那麼ptr2會指向null,需要特殊處理,令ptr1.next = null,這樣list尾部就不會丟。
其他情況就不用特殊處理結尾了,因為結尾沒有重複值,只須遍歷就夠了,不用特殊處理尾部。
程式碼如下:
1 public ListNode deleteDuplicates(ListNode head) {
2 if(head == null || head.next == null)
3 return head;
4
5 ListNode ptr1 = head;
6 ListNode ptr2 = head.next;
7
8 while(ptr2!=null){
9 if(ptr1.val == ptr2.val){
10 ptr2 = ptr2.next;
11 if(ptr2==null)
12 ptr1.next = null;
13 }else{
14 ptr1.next = ptr2;
15 ptr1 = ptr1.next;
16 ptr2 = ptr2.next;
17 }
18 }
19
20 return head;
21 }
2 if(head == null || head.next == null)
3 return head;
4
5 ListNode ptr1 = head;
6 ListNode ptr2 = head.next;
7
8 while(ptr2!=null){
9 if(ptr1.val == ptr2.val){
10 ptr2 = ptr2.next;
11 if(ptr2==null)
12 ptr1.next = null;
13 }else{
14 ptr1.next = ptr2;
15 ptr1 = ptr1.next;
16 ptr2 = ptr2.next;
17 }
18 }
19
20 return head;
21 }