代码随想录算法训练营第四天

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

题目链接/文章讲解/视频讲解: 代码随想录

思路:创建虚拟节点,两两一循环,每次循环有四个节点参与。

1节点指向3节点是因为如果不写的话链表就会断开,返回的时候就不是链表了,例如1>2>3>4 就会变为2>1 4>3

# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        node0 = dummy =  ListNode(next=head)
        node1 = head
        while node1 and node1.next:
            node2 = node1.next
            node3 = node2.next

            node0.next = node2
            node2.next = node1
            node1.next = node3

            node0 = node1
            node1 = node3
        return dummy.next

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

题目链接/文章讲解/视频讲解:代码随想录

思路:快慢双指针

# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        dummy = ListNode(next=head)
        slow = fast = dummy
        for _ in range(n):
            fast = fast.next
        while fast.next:
            slow = slow.next
            fast = fast.next
        slow.next = slow.next.next
        return dummy.next

面试题 02.07. 链表相交

题目链接/文章讲解:代随想录

思路:快慢双指针,将两个单链表放在同一起点上

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        lenA, lenB = 0, 0
        cur = headA
        while cur:         # 求链表A的长度
            cur = cur.next 
            lenA += 1
        cur = headB 
        while cur:         # 求链表B的长度
            cur = cur.next 
            lenB += 1
        curA, curB = headA, headB
        n = abs(lenA - lenB)
        if lenA > lenB:
            for _ in range(n):
                curA = curA.next
        else:
            for _ in range(n):
                curB = curB.next
        while curA:         #  遍历curA 和 curB,遇到相同则直接返回
            if curA == curB:
                return curA
            else:
                curA = curA.next 
                curB = curB.next
        return None 

142.环形链表II

题目链接/文章讲解/视频讲解:代码随想录

思路:快慢指针,若是一个还必会有一个相遇点,此时只需要知道还有多少步到入环点即可。

假设一圈步数为c,从头节点到入环处步数为a,相遇时slow走了b步,那么fast走了2b步,多走的步数为2b-b = kc-->b=kc。slow在环中走的步数为b-a-->kc-a,所以再走a步就到入环口了。

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        slow = head
        fast = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
            if slow == fast:
                while slow != head:
                    slow = slow.next
                    head = head.next
                return slow
        return None

还可以使用集合的方法,遍历节点

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        s = set()
        while head:
            if head in s:
                return head
            s.add(head)
            head = head.next
        return None
            

资源下载链接为:https://pan.quark.cn/s/9e7ef05254f8《兔兔计算书安装程序2.1.0.565》是一款专为工程计算量身打造的免费软件,为工程师在工程量计算工作流程上带来了极大的便利。它凭借直观易用且功能丰富的特点,深受众多用户青睐。该软件的核心优势在于强大的计算功能。它允许用户直接输入计算公式,无论是简单的数学运算,还是复杂的工程计算,都能轻松应对。同时,用户可以为每段计算添加文字备注,详细记录公式来源和计算过程,有效避免了因时间久远而遗忘关键信息的情况,确保了工作的准确性和可追溯性。在软件界面设计方面,兔兔计算书注重人性化,操作十分简便。即使是第一次接触该软件的用户,也能迅速上手。通过清晰的菜单布局和友好的交互设计,用户能够快速找到所需功能,进行计算和编辑。此外,兔兔计算书还提供了多种模板,覆盖了建筑、土木、电气等多个工程领域的常用计算,进一步简化了工作流程。免费是兔兔计算书的一大亮点。在众多专业计算软件收取高昂授权费用的情况下,兔兔计算书的免费策略为预算有限的个人用户或小型团队提供了优质的解决方案。用户无需担心额外的软件成本,就能享受到高效、专业的计算服务。而且,该软件的更新迭代也体现了开发者对用户需求的关注。版本号2.1.0.565可能包含了性能优化、bug修复以及新功能的添加,以满足用户日益增长的需求。用户只需安装压缩包内的“兔兔计算书安装程序2.1.0.565.exe”文件,就能轻松完成软件的安装和升级。在实际应用中,兔兔计算书能够有效提高工作效率,减少人为错误。它可以帮助工程师快速处理大量数据,进行精确计算,并且提供详尽的计算记录,便于审计和复核。这对于工程项目的质量和进度控制具有重要意义。兔兔计算书是一款值得信赖的工程计算工具。无论是在日常的工程量计算,还是在项目管理中,它都能发挥强大的辅助作用。开发者通过免费提供这
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值