代码随想录算法训练营第四天-链表part2

day2和day3回家太晚,刷完题忘记写笔记了 - -!

24.两两交换链表中的节点

给自己的笔记:

虚拟节点法是创建一个节点,它的next指针指向链表的头节点,这样便于:

  1. current指向虚拟节点,然后对链表进行操作交换
  2. 最后返回头节点:return dummyNode.next
python 复制代码
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        #创建虚拟节点
        dummyNode=ListNode(next=head)
        #curr 指向dummyNode
        curr=dummyNode
        while(curr.next and curr.next.next):#cur的下一位和下下一位都在 才会进入循环
            temp=curr.next
            temp1=curr.next.next.next
            curr.next=curr.next.next
            curr.next.next=temp
            temp.next=temp1
            curr=curr.next.next#curr往前2位
        return dummyNode.next #返回头节点
       

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

  1. 笨办法,先遍历所有节点获得链表长度。
python 复制代码
class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
        #虚拟头节点
        dummyNode=ListNode(next=head)
        curr=dummyNode
        sizeLink=0
        count=0
        while(curr.next):
            sizeLink+=1
            curr=curr.next
        x=sizeLink-n
        curr=dummyNode
        if(sizeLink==1):
            return None
        if(sizeLink==n):
            return head.next
        while(curr.next):
            curr=curr.next
            count+=1
            if(count==x):
                curr.next=curr.next.next   
        return dummyNode.next
  1. 双指针法
    tips:数组也是可以这样的思路
python 复制代码
class Solution(object):
    def removeNthFromEnd(self, head, n):
        dummyNode=ListNode(next=head)
        slow=dummyNode
        fast=slow
        curr=dummyNode
        for i in range(n+1):#注意是n+1,这样快指针走到尾,慢指针停在要删的节点前一个节点
            fast=fast.next
        
        while(fast!=None):
            fast=fast.next
            slow=slow.next
        slow.next=slow.next.next
        return dummyNode.next

面试题 02.07. 链表相交

核心思想是求两个链表长度差,让指向长链表头指针移动到,和短链表头指针对齐的位置

比如:

A: 4,1,8,4,5

currA->4

B:5,0,1,8,4,5

currB->0

python 复制代码
class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        dummyNodeA=ListNode(next=headA)
        currA=dummyNodeA
        sizeA,sizeB=0,0
        dummyNodeB=ListNode(next=headB)
        currB=dummyNodeB
        curr,curr2=headA,headB
        while curr:
            curr=curr.next
            sizeA+=1
        while curr2:
            curr2=curr2.next
            sizeB+=1
        diff=abs(sizeA-sizeB)#长度差
        
        for i in range(diff):#让长链表指针移动到,和短链表头指针对齐的位置
            if sizeA>sizeB:
                currA=currA.next
            else:
                currB=currB.next
        
        while currA=currB #当指针相等
            currA=currA.next
            currB=currB.next
        return currA
        
        

142.环形链表II

...待补充

相关推荐
北域码匠10 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
指掀涛澜天下惊11 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
乌萨奇也要立志学C++11 小时前
【洛谷】kmp算法
开发语言·算法
禹凕11 小时前
Dijkstra算法详解与应用
python·算法
YaraMemo12 小时前
元启发式算法框架
人工智能·算法·5g·信息与通信·启发式算法·信号处理
weixin_3077791312 小时前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN12 小时前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
枫叶林FYL13 小时前
【群体智能集群控制工程实践】第3章 一致性协同算法
算法
禹凕14 小时前
滑动窗口算法实战指南
python·算法
DisonTangor14 小时前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手