82.刪除排序鏈表中的重複元素II
題目描述
給定一個排序鏈表,刪除所有含有重複數字的節點,只保留原始鏈表中 沒有重複出現 的數字。
示例 1:
輸入: 1->2->3->3->4->4->5
輸出: 1->2->5
示例 2:
輸入: 1->1->1->2->3
輸出: 2->3
題解
雙指針法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//空鏈表直接返回null
if (head == null) {
return null;
}
//定義鏈表題標配dummy節點,方便之後打印
ListNode dummy = new ListNode(0);
dummy.next = head;
//雙指針
ListNode la = dummy;
ListNode pre = head;
while (pre != null) {
//快指針的值與後繼相同時,快指針走,與後繼不同時,將慢指針的後繼指向快指針的後繼,快指針走,繼續比較快指針當前值與其後繼值,若不同則快慢同時移動,若相同,則只移動快指針
if (pre.next != null && pre.val == pre.next.val) {
pre = pre.next;
while (pre.next != null && pre.val == pre.next.val){
pre = pre.next;
}
la.next = pre.next;
pre = pre.next;
} else {
pre = pre.next;
la = la.next;
}
}
return dummy.next;
}
}