LeetCode solutionsLeetcode模拟面试算法提高之LeetCode刷题

[leetcode刷题笔记]链表的递归、双指针解法

2020-07-08  本文已影响0人  KeyLiu7

链表是基础的数据结构,在作链表算法时,除了使用暴力循环的方法外(很多时候暴力方法会造成超时不可取),还有一些其他方法,如递归,双指针法,哈希表法等。本文记录LeetCode刷题一些知识点,水平有限还望多多指正

1.删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

使用递归可以使代码简化很多。

class Solution:
    def deleteNode(self, head: ListNode, val: int) -> ListNode:
        if head == None:
            return None
        if head.val == val:
            return head.next
        head.next = self.deleteNode(head.next,val)
        return head

2.合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1:
            return l2
        if not l2:
            return l1
    
        if l1.val <= l2.val:
            l1.next = self.mergeTwoLists(l1.next,l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1,l2.next)
            return l2

3.环形链表

给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。


快慢指针法,这是通过这道题新学到的方法,就像两个环形跑道上跑步快慢的运动员,若存在环,则快指针能够追上慢指针,这在检测是否有环很实用。

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if not head or not head.next:
            return False
    
        slow = head
        fast = head

        while slow and fast.next:
            slow = slow.next
            fast = fast.next.next

            if slow == fast:
                return True
            if not fast:
                return False

        return False

4.相交链表

编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表


在节点 c1 开始相交。

双指针法 两个指针分别指向headA与headB,以此向后比较,当 p 到达链表的尾部时,将它重定位到链表 B 的头结点 (你没看错,就是链表 B); 类似的,当 q 到达链表的尾部时,将它重定位到链表 A 的头结点。若某一时刻p=q,则为交点。

若存在交点经过O(m+n)时间一定能找到交点。

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

题目和部分解析来源力扣(LeetCode),更多内容后续补充,欢迎指正。

上一篇下一篇

猜你喜欢

热点阅读