leetcode系列-删除排序链表中的重复元素 II(这题我会做系列)

分类:链表

难度:medium

方法:双指针

  1. 删除排序链表中的重复元素 II

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

示例 1:

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

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

题解

我的思路是双指针
首先设置一个新节点res,和一个遍历的指针pos
使用快慢两个指针cur1,cur2分别指向头部节点和头部节点的下一个
初始化状态:
(1)cur1,cur2的值如果不同,则显然cur1是非重复的,pos指向cur1,所有指针向前前进一格
(2)如果cur1,cur2的值相同,则当前cur1的节点为重复节点,不断后移cur2,直到找到一个值不同的新节点,重新将cur1指向新节点,cur2指向它的next

不断循环上述判断

结束条件:
最后别忘了,如果cur1指向的是非空节点,要加入返回的链表中,然后指向空,结束
如果cur1指向空节点,则直接指向空节点,结束

代码

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

class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if not head or not head.next:
            return head
        cur1,cur2 =head,head.next
        pos = res = ListNode(-1)
        
        while cur1 and cur2:
#             print(cur1.val,cur2.val)
            if cur1.val != cur2.val:
                pos.next = cur1
#                 print(pos.val)
#                 print(pos.next.val)
                pos = pos.next
                cur1 = cur1.next
                cur2 = cur2.next
            if cur1 and cur2 and cur2.val==cur1.val:
                while cur2 and cur2.val==cur1.val:
                    cur2 = cur2.next
                cur1 = cur2
#                 print(cur2.val)
                if cur2:
                    cur2 = cur2.next
        if cur1 and not cur2:
            pos.next = cur1
            pos = pos.next
        pos.next=None
        return res.next

代码越来越乱额

发布了41 篇原创文章 · 获赞 0 · 访问量 6150

猜你喜欢

转载自blog.csdn.net/Yolo_C/article/details/104951423