题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
看别人说这题面试挺常考的,看了一下之前自己leetcode同一题的代码写得跟论文一样长,找了一个别人代码学习感觉还不错
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplication(self, pHead):
# write code here
# write code here
if not pHead or not pHead.next:
return pHead
dummy = ListNode(0) #为了防止第一个结点就需要删
dummy.next = pHead
pre = dummy #记录一个pre,用来记录要删的前一个位置
cur = dummy.next #当前位置用来循环
while cur:
if cur.next and cur.next.val==cur.val: #如果当前跟下一个值相等说明有重复
val = cur.val #把值记下来
while cur and cur.val==val: #来一个重复的删一个,pre位置始终不变
del_node = cur #把要删的记下来然后del
pre.next = cur.next #删
cur = cur.next #循环
del del_node #释放结点
else:
pre = pre.next #没有要删的时pre和cur都后移一个
cur = cur.next
return dummy.next
leetcode 82. 删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
加一个flag判断要不要删:
# 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
cur = dummy = ListNode(0)
dummy.next = head
flag = 0
while(dummy.next):
if dummy.next.next:
if dummy.next.val == dummy.next.next.val:
flag = 1
dummy.next = dummy.next.next
elif flag==1 and dummy.next.val != dummy.next.next.val:
dummy.next = dummy.next.next
flag = 0
elif flag==0 and dummy.next.val != dummy.next.next.val:
dummy = dummy.next
else:
if flag==1:
dummy.next = dummy.next.next
else:
dummy = dummy.next
return cur.next
下面思路跟第一个差不多,写法复杂一点:
# 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
cur = dummy = ListNode(0)
dummy.next = head
while(dummy.next):
if dummy.next.next:
if dummy.next.val == dummy.next.next.val:
pre = dummy
val = dummy.next.val
dummy = dummy.next
while(dummy):
if val == dummy.val:
dummy = dummy.next
else:
break
pre.next = dummy
dummy = pre
else:
dummy = dummy.next
else:
dummy = dummy.next
return cur.next