leetcode刷题记录DAY4:两两交换链表中的节点+删除链表的倒数第N个节点+链表相交+环形链表【代码随想录39期】

写在前面

本人因准备秋招,决定从2024.6.5日起开始正式刷题。之前虽然也陆续刷过,但总是比较零散(力扣Top100只刷了30道),这次真的拖不起了,所以开此贴,请大家监督我。

本贴主要以记录刷题思路为主,不能直接运行,是一种不太标准的伪代码。我用python编程。

6.8完成情况(DAY4)

第一题看完视频后基本一次复现。第二题实际采用的思路是fast“抢跑N步”,而不是N+1(fast会指向None),两种思路都能理解,但我能接受N步法。

两两交换链表中的节点24

虚拟头节点

dummy=ListNode()
dummy.next=head
cur = dummy
while cur.next!=None and cur.next.next!=None:
    tmp1=cur.next
    tmp2=cur.next.next.next
    cur.next = cur.next.next
    cur.next.next=tmp1
    tmp1.next=tmp2
    cur=cur.next.next #没有三个next
return dummy.next

删除链表的倒数第N个节点19

dummy-1-2-3-None

现在要删倒1节点,fast要先动【1】次到1,然后fast和slow一起移动【2】次才能保证slow在倒1节点的前一位

虚拟头节点,快慢指针

dummy=ListNode()
dummy.next = head
fast, slow=dummy, dummy #不是0
while n and fast.next!=None: #fast抢跑n步,slow不动,为了让fast指向最后一个节点时,slow刚好指向倒N个节点的前一个节点
    fast=fast.next, n-=1
while fast.next:
    fast=fast.next, slow=slow.next
slow.next = slow.next.next
return dummy.next

面试题 02.07. 链表相交 160

感觉这道题目有点stupid,虽然理解了步骤,但不知道在干啥,死记住流程吧
求两链表长度-把curB作为长链,curB移到curA对应位置-一起比较,找相等的指针

cur=headA
sizeA=1
while cur.next:
    cur=cur.next
    sizeA += 1
cur=headB
sizeB=1
while cur.next:
    cur=cur.next
    sizeB += 1
curA, curB = headA,headB	#统计完了,别忘了重新把指针归位
if sizeA > sizeB:
    sizeA, sizeB = sizeB, sizeA
    headA, headB = headB, headA
curA, curB = headA, headB
diffsize = sizeB - sizeA
while diffsize:
    curB=curB.next, diffsize -= 1
while curA:
    if curA == curB:
        return curA
    else:
        curA=curA.next, curB=curB.next
return None

环形链表II 142

快慢指针
主要思想就是,快指针一定会在环的后面追上慢指针,能追上的话(fast==slow)就有环
确定入环位置有一个小定理证明,找恒等关系

fast,slow=head, head
if not fast:
    return None

while fast.next and fast.next.next:
    fast = fast.next.next
    slow = slow.next
    if fast == slow:
        index1=fast
        index2=head
        while index1!=index2:
            index1=index1.next
            index2=index2.next
        return index2
        
return None
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值