(难题)剑指offer JZ56:删除链表中重复的结点

剑指offer JZ56:删除链表中重复的结点

问题

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路

这道题看上去很简单,但是细细做起来就会发现非常困难

首先,最简单的方法是直接将所有的链表和对应的数值输出到两个列表中,然后根据数值列表中前后位置元素大小是否相同,对应的删除链表列表中的元素,最后将链表列表组装成链表即可,但是这样会占用额外的空间复杂度,感觉不会是面试官想要的方法。

直接进行本底重排看似简单,但是实际上会遇到很多的问题,比如:
整个链表元素都一样,最后删除下来只有空集
整个链表都是由元素相同的子集组成,最后删除下来还是只有空集
在下一个链表和这一个链表的数值判断的时候,需要判断下一个链表是否到了队尾,来判断是否需要继续循环,还是直接使next = None
本人尝试着写完了一个,也成功运行了,但是感觉太过复杂,所以也不使用。

最后,笔者思考到了一个妙招。之前的问题无非在于,当最后输出的链表是空集时,需要特别讨论,所以非常的繁琐。如果在头链表前加上一个链表,则最终只要判断这个链表后面有没有链表,就对应着输出结果是否为空集。如此就极大的简化了代码。

代码及解释

class Solution:
    def deleteDuplication(self, pHead):
        # write code here
        head = pHead
        if head == None or head.next == None:
            return head
        begin = ListNode(0)
        begin.next = head
        lastnode = begin
        curnode = head
        while curnode.next:
            if curnode.val != curnode.next.val:
                lastnode = curnode
                curnode = curnode.next
            else:
                while curnode.next and curnode.val == curnode.next.val:
                    curnode = curnode.next
                if curnode.next:
                    lastnode.next = curnode.next
                    curnode = curnode.next
                else:
                    lastnode.next = None
        if begin.next == None:
            return None
        else:
            return begin.next

你可能感兴趣的:(剑指offer)