首页 > 编程语言 >代码随想录算法训练营第四天 | Python | LeetCode24.两两交换链表中的节点、19.删除链表的倒数第 N 个结点、面试题02.07.链表相交、42.环形链表 II

代码随想录算法训练营第四天 | Python | LeetCode24.两两交换链表中的节点、19.删除链表的倒数第 N 个结点、面试题02.07.链表相交、42.环形链表 II

时间:2024-07-11 16:26:25浏览次数:21  
标签:面试题 ListNode cur 随想录 head fast next 链表

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

题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/
文章/视频链接:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
掌握程度:3星

双指针

反转
请添加图片描述
指针移动
请添加图片描述
结束条件
请添加图片描述

注意!结束条件竟是 while cur and cur.next,两种解释:

  1. 链表长度<2时,直接返回自身
  2. 推演最后一步,发现有两种可能情况,剩余0/1个需要旋转的节点,这时候选择不旋转,直接返回。
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        pre = dummy = ListNode(val=0, next=head)
        cur = head
        while cur and cur.next:
            tmp = cur.next
            pre.next = tmp
            cur.next = tmp.next
            tmp.next = cur
            
            pre = cur
            cur = pre.next
        return dummy.next

迭代

1 -> 2 -> 3 -> 4 -> None

我们可以把 1 -> 2 拿出来,让 2 -> 1,1 -> 转换后的链表,做输出。后面的链表做转换也是这个流程:处理 3 -> 4,让 4 -> 3,3 -> 后面的链表做转换。

class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        while head == None or head.next == None:
            return head
        node1 = head
        node2 = head.next
        node3 = head.next.next
        node2.next = node1
        node1.next = self.swapPairs(node3)
        return node2

LeetCode19. 删除链表的倒数第 N 个结点

题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
文章/视频链接:https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
掌握程度:三星

暴力解法肯定是遍历一遍,记录链表长度,再遍历一遍,找到倒数第n个节点在哪,删除。

简单的办法是用双指针,让slow和fast中间相隔n个节点。这里仍然需要注意循环结束。无非是cur和cur.next两种常见情况,在最后一步推演一下就能得出。

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

面试题 02.07. 链表相交

题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/
文章/视频链接:https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html
掌握程度:2星

一开始拿到这道题的时候,想法是反转链表,判断数值是否相等。但是发现题目中写了这么一句话:注意,函数返回结果后,链表必须保持其原始结构。那反转链表是肯定不能做的了。

我会想到反转链表的原因是,想要判断数值相等。其实这有点多此一举了,当我们指针指向某个节点时,判断相等指的是指链表相等而不是数值相等。没必要依次判断数值了。

这么说就简单了,我们让链表末尾对齐,判断是否相等就好了。

常规做法

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        curA, curB = headA, headB
        sizeA, sizeB = 0, 0
        while curA:
            sizeA += 1
            curA = curA.next
        while curB:
            sizeB += 1
            curB = curB.next
        curA, curB = headA, headB
        if sizeA > sizeB:
            res = sizeA - sizeB
            for _ in range(res):
                curA = curA.next
        elif sizeA < sizeB:
            res = sizeB - sizeA
            for _ in range(res):
                curB = curB.next
        while curA:
            if curA == curB:
                return curA
            curA = curA.next
            curB = curB.next
        return None

双指针

一个没见过就想不出来的做法:
https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/solutions/1190240/mian-shi-ti-0207-lian-biao-xiang-jiao-sh-b8hn/

咱们也不知道为什么但就是很厉害

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        A, B = headA, headB
        while A != B:
            A = A.next if A else headB
            B = B.next if B else headA
        return A

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/
文章/视频链接:https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html
掌握程度:0星

双指针

  1. fast每次走两格,slow每次走一格,如果能相遇,那么是环形链表。为什么一定能相遇?快慢指针的相对速度是1格,fast一定能遇到slow。加入相对速度是2,fast可能会越过slow。
  2. p从head点出发,q从相遇点出发,一定会在环点相遇。
    请添加图片描述
class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        fast = head
        slow = head
        while True:
            if not (fast and fast.next):
                return
            fast = fast.next.next
            slow = slow.next
            if fast == slow:
                break
        fast = head
        while fast != slow:
            fast = fast.next
            slow = slow.next
        return fast

哈希表

遍历链表,保存在哈希表中,如果遇到之前见过的链表,那么返回,如果没有,返回null

class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        Hash = {}
        cur = head
        while cur:
            if cur in Hash:
                return cur
            Hash[cur] = True
            cur = cur.next
        return

为什么要用哈希表保存链表,不用list?
查找快,哈希表查找时间复杂度为O(1),而链表是O(n).

今天就到这里了,再见ヾ( ̄▽ ̄)ByeBye

标签:面试题,ListNode,cur,随想录,head,fast,next,链表
From: https://blog.csdn.net/weixin_45724176/article/details/140271611

相关文章

  • 代码随想录算法训练营Day11 | 栈与队列基础 232.用栈实现队列 225. 用队列实现栈 20.
    栈与队列栈:先进后出   empty-push-push-pop队列:先进先出Tips: 栈和队列是STL(C++标准库)里面的两个数据结构。STL最旁边的三个版本:HPSTL、P.J.PlaugerSTL、SGISTL232.用栈实现队列题目:232用栈实现队列在python中,in主要负责push,out主要负责pop初始:self.......
  • Java面试题系列 - 第9天
    题目:深入探讨Java中的设计模式及其应用场景背景说明:设计模式是软件工程中解决问题的常见方案,它们提供了经过验证的模板,帮助开发者解决在软件设计过程中遇到的特定问题。在Java中,熟悉并正确应用设计模式能够显著提升代码的可读性、可维护性和可扩展性。问题要求:解释设计模式......
  • JavaSE基础面试题 (24年7月10日)
    1、Lambda的作用:用于简化匿名内部类的书写我们可以用下面的格式编写Lambda(被重写方法的形参列表)->{        被重写方法的方法体代码;}需要说明的是,使用Lambda表达式之前,必须先有一个接口,而且接口中只能有一个抽象方法。(注意:不能是抽象类,只能是接口)......
  • 代码随想录刷题day 8 | 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
    344.反转字符串classSolution{publicvoidreverseString(char[]s){intleft=0,right=s.length-1;while(left<right){chartmp=s[left];s[left]=s[right];s[right]=tmp;left+......
  • 【经典面试题】环形链表
    1.环形链表oj2.oj解法利用快慢指针:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/typedefstructListNodeListNode;boolhasCycle(structListNode*head){ListNode*slow=......
  • leetcode||707.双向链表
    1.思路:设置虚拟头节点和虚拟尾节点2.为了提高查询效率,在根据索引查找节点的值时注意头尾虚拟节点的选择。java代码publicclassDoubleList707{//1.双向链表的结构privateclassListNode{intvalue;ListNodepre;ListNodenext;......
  • 计算机网络-HTTP常见面试题
    目录1.HTTP是什么?2.HTTP常见的状态码?3.HTTP常见的字段有哪些?4.GET和POST有什么区别:5.GET和POST方法都是安全和幂等的吗?6.HTTP缓存技术7.HTTP/1.1相比HTTP/1.0提高了什么性能?8.HTTP/2做了什么优化?9.HTTP3做了哪些优化10.SSL/TLS的握手过程1.HTTP是什么?......
  • 代码随想录day20 二叉搜索树的最近公共祖先 | 二叉搜索树中的插入操作 | 删除二叉
    二叉搜索树的最近公共祖先二叉搜索树的最近公共祖先解题思路利用二叉搜索树的特性,公共祖先的值,就是在要找的两个值的区间里面知识点二叉搜索树心得想了一会如何利用二叉搜索树的特性。顺便复习了昨天做的题目二叉搜索树中的插入操作二叉搜索树中的插入操作解题思路在......
  • 信息学奥赛初赛天天练-43-CSP-J2020基础题-链表、连通图、2进制转10进制、栈、队列、
    PDF文档公众号回复关键字:202407102020CSP-J选择题单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)7.链表不具有的特点是()A.可随机访问任一元素B.不必事先估计存储空间C.插入删除不需要移动元素D.所需空间与线性表长度成正比8.有10个顶点的无向图至少......
  • 字节面试题:在线表格功能怎么实现?怎么测?
    最近有小伙伴私信问我怎么不更新了,期待更新,甚是感动。简述下自己近况:还在干测试,最近忙活的事情大概是自动化测试、性能测试以及业务等等,主打一个啥活都干。业余时间,尝试在短视频赛道搞一些个人兴趣领域的创作,所以博客不太更新,想分享的东西还是有的,后续仍然会记录一些工作心得,感......