Leetcode题解 - 链表简单部分题目代码+思路(21、83、203、206、24、19、876)

??本次部分没有带题目,因为链表系列的题目有的非常直观,从名字中就能知道到底需要做什么。

21. 合并两个有序链表
"""
(用中间链表的方法)可以想象为双指针,分别指向两个链表,比较指针当前指向的值(因为是比较当前的值所以不需要判断next是否为空),拥有较小值的链表指针后移。
"""
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        head = ListNode(0)
        tmp = head
        while l1 and l2:
            if l1.val <= l2.val:
                tmp.next = l1
                l1 = l1.next
            else:
                tmp.next = l2
                l2 = l2.next
            tmp = tmp.next
        if l1:
            tmp.next = l1
        else:
            tmp.next = l2
        return head.next

83. 删除排序链表中的重复元素
"""
因为涉及到删除操作,所以需要记录前一个结点的信息
"""
class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        dummy = ListNode(float("inf"))
        dummy.next = head
        pre = dummy
        vis = set()
        # pre为当前结点的前一个,head象征当前操作的节点
        while pre and head:
            if head.val in vis:
                # 遇到需要删除的元素,切断当前pre和head的线
                pre.next = head.next
                head = head.next
                continue
            vis.add(head.val)
            pre = head
            head = head.next
        return dummy.next

203. 移除链表元素
"""
删除结点,需要记录其前一个结点(和上面一个题目几乎相同)
"""
class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
        pre = dummy
        while pre and head:
            if head.val == val:
                pre.next = head.next
            else:
                pre = head
            head = head.next
        return dummy.next

206. 反转链表
"""
每次遍历到一个结点就插入到新链表的头部(头插法)
"""
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head:
            return
        newhead = ListNode(head.val)
        head = head.next
        while head:
            tmp = head.next
            head.next = newhead
            newhead = head
            head = tmp
        return newhead

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

"""
非常直观(但并算很好的思路),遍历链表,交换奇偶位,重新建立建立链表。
"""
class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        if not head:
            return
        l = []
        while head:
            l.append(head.val)
            head = head.next
        lens = len(l)
        if len(l) % 2 != 0:
            lens -= 1
        for i in range(1, lens, 2):
            l[i], l[i-1] = l[i-1], l[i]
        thead = ListNode(l.pop(0))
        curr = thead
        for j in l:
            curr.next = ListNode(j)
            curr = curr.next
        return thead
19. 删除链表的倒数第N个节点

"""
双指针,两个相隔n-1,则快指针走到末尾的时候,慢指针正好走到倒数第n个
"""
class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        slow = head
        quick = head
        # 因为要删除节点,所以需要记录前一个节点
        pre = head
        # 先让快指针走n-1步
        for i in range(n-1):
            quick = quick.next
        # 如果走完之后已经到了末尾,那么直接删掉头
        if not quick.next:
            head = head.next
            return head
        while quick.next:
            quick = quick.next
            pre = slow
            slow = slow.next
        pre.next = slow.next
        return head
876. 链表的中间结点
"""
遍历链表同时记录位置,直接返回位于中间的结点即可。
"""
class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        mat = {}
        i = 0
        while head:
            mat[i] = head
            head = head.next
            i += 1
        return mat[i // 2]

原文地址:https://www.cnblogs.com/NFii/p/12075782.html

时间: 2024-11-05 17:20:02

Leetcode题解 - 链表简单部分题目代码+思路(21、83、203、206、24、19、876)的相关文章

Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)

700. 二叉搜索树中的搜索 - 树 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 思路: 二叉搜索树的特点为左比根小,右比根大.那么目标结点就有三种可能: 1. 和根一样大,那么直接返回根即可. 2. 比根的值小,那么应该再去次左子树中搜索. 3. 比根的值大,那么应该再次去右子树中搜索. 可以看到这就是一个递归的思路. class Solution: def searchBST(self

Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)

leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三个5)或者(一个10一个5),每次都从大的开始找起来 """ class Solution: def lemonadeChange(self, bills) -> bool: five = 0 ten = 0 for i in bills: if i == 5: five

Leetcode题解 - DFS部分题目代码+思路(756、1034、1110、491、721、988)

756. 金字塔转换矩阵 """ 学到的新知识: from collections import defaultditc可以帮我们初始化字典,不至于取到某个不存在的值的时候报错.例如列表类型就会默认初始值为[],str对应的是空字符串,set对应set( ),int对应0 思路: 通过本层构建上一层(DFS,类似于全排列),看是否能构建成功(递归) """ from collections import defaultdict class Sol

[LeetCode]题解(python):031-Next Permutation

题目来源 https://leetcode.com/problems/next-permutation/ Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible

[LeetCode 题解]: Reverse Nodes in K-Groups

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is. You may not alter the values in the nodes, only nod

leetcode题解日练--2016.7.7

日练三题,冰冻三尺非一日之寒. 今日题目:1.出现一次的数II:2.房子小偷III:3.生成括号. 今日摘录:有些事,只能一个人做.有些关,只能一个人过.有些路啊,只能一个人走.–龙应台<目送> 137. Single Number II | Difficulty: Medium Given an array of integers, every element appears three times except for one. Find that single one. Note: Yo

[LeetCode 题解]: Rotate List

Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1->2->3->4->5->NULL and k = 2,return 4->5->1->2->3->NULL. 题意: 翻转链表. 思路: 首先需要读懂题意.题目的描述有问题,应该是将链表的最后k个元素移动到链表的头部. 这道题的本质就是寻找链表的

leetcode题解:Binary Tree Postorder Traversal (二叉树的后序遍历)

题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 说明: 1) 两种实现,递归与非递归 , 其中非递归有两种方法 2)复杂度分析:时

[LeetCode]题解(python):009-Palindrome Number

题目来源: https://leetcode.com/problems/palindrome-number/ 题意分析: 这题是要判断一个int是否一个回文数,要求不能申请额外的空间. 题目思路: 这题也是一个简单的题目,由于不能申请额外的空间,所以不能将int转换成string来处理.根据回文数的定义,我们可以考虑将一个int翻转过来,翻转的时候要注意不能超过32位int的最大值. 代码(python): 1 class Solution(object): 2 def isPalindrome