Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
Input: 1->2->3->3->4->4->5 Output: 1->2->5
Example 2:
Input: 1->1->1->2->3 Output: 2->3
Algorithm:
1. Insert a dummy node to the head of the input linked list for easier implementation since the root node may change.
2. Use a slow pointer to track the previous node with distinct number, a fast pointer to track the last node of the same duplicated number.
3. Find the last node of the same duplicated number. If this last node is right next to the previous node with distinct number we know this last node has a distinct number. Simply forward both pointer. Otherwise, we know this last node has some nodes before it that have the same value. Skip all these duplicated nodes and set the fast pointer to the next node and start a new duplication check for a new value.
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode deleteDuplicates(ListNode head) { ListNode dummy = new ListNode(0), slow = dummy, fast = head; slow.next = fast; while(fast != null) { while (fast.next != null && fast.val == fast.next.val) { fast = fast.next; } if (slow.next != fast) { slow.next = fast.next; fast = slow.next; } else { slow = slow.next; fast = fast.next; } } return dummy.next; } }
本文介绍了一种算法,用于从已排序的链表中删除所有具有重复数值的节点,仅保留原始列表中的唯一数值。通过插入一个虚拟头节点简化实现过程,并使用快慢指针策略定位并移除重复节点。
719

被折叠的 条评论
为什么被折叠?



