LeetCode #82 Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II

82 Remove Duplicates from Sorted List II 删除排序链表中的重复元素 II

Description:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

Return the linked list sorted as well.

Example:

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

题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 :

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

思路:

新建一个 dummy结点, dummy结点的下一个结点指向 head
用两个指针分别指向 dummy结点和 head
指向 head的指针作为工作指针, 查找并跳过重复的结点
时间复杂度O(n), 空间复杂度O(1)

代码:
C++:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution 
{
public:
    ListNode* deleteDuplicates(ListNode* head) 
    {
        if (!head or !head -> next) return head;
        ListNode* result = new ListNode(-1);
        result -> next = head;
        ListNode *p = head, *q = result;
        while (p)
        {
            if (p -> next and p -> next -> val == p -> val)
            {
                while (p -> next and p -> next -> val == p -> val) p = p -> next;
                q -> next = p -> next;
                p = p -> next;
            }
            else
            {
                p = p -> next;
                q = q -> next;
            }
        }
        return result -> next;
    }
};

Java:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode result = new ListNode(-1);
        result.next = head;
        ListNode p = head, q = result;
        while (p != null) {
            if (p.next != null && p.next.val == p.val) {
                while (p.next != null && p.next.val == p.val) p = p.next;
                q.next = p.next;
                p = p.next;
            } else {
                p = p.next;
                q = q.next;
            }
        }
        return result.next;
    }
}

Python:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        result = ListNode(-1)
        result.next, p, q = head, head, result
        while p:
            if p.next and p.val == p.next.val:
                while p.next and p.val == p.next.val:
                    p = p.next
                q.next = p.next
                p = p.next
            else:
                p = p.next
                q = q.next
        return result.next
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容