提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
回归第一天!
一、题目
删除排序链表中的重复元素 II
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2
输入:head = [1,1,1,2,3]
输出:[2,3]
提示
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
二、思路
首先确认一下特殊情况,当链表中元素是0或1个时,无法重复,直接返回即可。
然后用双指针遍历一遍链表,p和q中间隔一个元素,p是确认不被删除的最后一个元素:
①若p.next和q的值相同,把q删掉,q后移;
直至p.next与q不同,把p.next删掉,并且为了保持p和q中间隔一个元素,只要此时q不为空,就向后移动一下;
②若不同,p的next是安全的,p和q后移
三、代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
if(head==None or head.next==None): #0或1个元素,无法重复
return head
Head=p=ListNode(0,head)#遍历指针,先指向头结点
q=Head.next.next
while(q !=None): #当q不为空
if(p.next.val==q.val): #若p.next和q值相同
while(q!=None and p.next.val ==q.val):
p.next.next=q.next #删q
q=q.next #q后移
p.next=p.next.next #直至p.next与q不同,把p.next删掉,
if(q != None):
q=q.next #为了和p隔一个,q后移
else: #p.next安全,可以向后移动
p=p.next
q=q.next
return Head.next
四、题目
分隔链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2
输入:head = [2,1], x = 2
输出:[1,2]
提示
链表中节点的数目在范围 [0, 200] 内
-100 <= Node.val <= 100
-200 <= x <= 200
五、思路
就是简单的设置两个头结点,在遍历的过程中不断更改头结点的指针,直到遍历结束
需要注意的是最后两个队列的合并的操作,低的尾连接高的,高的尾一定设置为None,否则就会出现循环链表~
六、代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:
p1=low=ListNode(0,None) #小于的头指针
p2=high=ListNode(0,None) #大于的头指针
p=head
while(p != None): #遍历链表
#print(p.val)
if(p.val<x): #小的
p1.next=p
p1=p1.next
else: #大或等的
p2.next=p
p2=p2.next
p=p.next
p2.next=None #断开!!!重点,否则就会形成循环链表!
p1.next=high.next #连接
return low.next