• 链表-(1)


    合并两个有序链表
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 
    示例:
    
    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4
    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
    删除排序链表中的重复元素
    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
    
    示例 1:
    输入: 1->1->2
    输出: 1->2
    示例 2:
    输入: 1->1->2->3->3
    输出: 1->2->3
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def deleteDuplicates(self, head: ListNode) -> ListNode:
            if head is None or head.next is None:
                return head
            
            child = self.deleteDuplicates(head.next)
            if child and head.val == child.val:
                head.next = child.next
                child.next = None
                
            return head

    理解为:

    206. 反转链表
    反转一个单链表。
    
    示例:
    
    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            cur, pre = head, None
            while cur:
                cur.next, pre, cur = pre, cur, cur.next
            return pre
    234. 回文链表
    请判断一个链表是否为回文链表。
    
    示例 1:
    输入: 1->2
    输出: false
    示例 2:
    输入: 1->2->2->1
    输出: true
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def isPalindrome(self, head: ListNode) -> bool:
            stack = []
            slow = head
            fast = head
            
            while(fast and fast.next):
                stack.append(slow)
                slow = slow.next
                fast = fast.next.next
            if fast: 
                # 奇数
                slow = slow.next
           
            while(stack):
                curr = stack.pop()
                if curr.val != slow.val:
                    return False
                slow = slow.next
            return True
    链表的中间结点
    给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
    
    如果有两个中间结点,则返回第二个中间结点。
    示例 1:
    输入:[1,2,3,4,5]
    输出:此列表中的结点 3 (序列化形式:[3,4,5])
    返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
    注意,我们返回了一个 ListNode 类型的对象 ans,这样:
    ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
    示例 2:
    输入:[1,2,3,4,5,6]
    输出:此列表中的结点 4 (序列化形式:[4,5,6])
    由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
    class Solution:
        def middleNode(self, head: ListNode) -> ListNode:
            fast, slow = head, head
            while(fast and fast.next):
                fast = fast.next.next
                slow = slow.next
            
            return slow
    二进制链表转整数
    给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。
    
    请你返回该链表所表示数字的 十进制值 
    输入:head = [1,0,1]
    输出:5
    解释:二进制数 (101) 转化为十进制数 (5)
    class Solution:
        def getDecimalValue(self, head: ListNode) -> int:
            rec = 0
            while head != None:  
                rec = rec * 2 + head.val # 相当于rec = rec<<1 | head.val
                head = head.next
            return rec
    相交链表
    编写一个程序,找到两个单链表相交的起始节点。
    class Solution:
        def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
            A = set()
            cur1 = headA
            cur2 = headB
            while cur1:
                A.add(cur1)
                cur1 = cur1.next
            while cur2:
                if cur2 in A:
                    return cur2
                cur2 = cur2.next
            return None
    
    class Solution:
        def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
            ha, hb = headA, headB
            while ha != hb:
                #互相走一下对方的路,就能相遇
                ha = ha.next if ha else headB
                hb = hb.next if hb else headA
            return ha
    链表问题总结为:
    1)递归处理
    2)双指针,快慢指针
    3)迭代
    4)hash
  • 相关阅读:
    8.C++-类的关键字
    BFS-九宫格重排(详解)
    7.C++类与封装的概念
    4.数码相框-freetype多行显示,居中显示
    3.数码相框-通过freetype库实现矢量显示
    Linux-iconv命令、并批处理将所有GBK文件转换为UTF8(18)
    2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)
    1.数码相框-相框框架分析(1)
    Kotlin 之操作符重载
    Andorid-解决View重复点击的思路
  • 原文地址:https://www.cnblogs.com/topass123/p/13437104.html
Copyright © 2020-2023  润新知