LeetCode之相交链表(160)、分割链表(725)

1、相交链表(160)

题目描述:

【简单题】
编写一个程序,找到两个单链表相交的起始节点。

如下面的两个链表:

LeetCode之相交链表(160)、分割链表(725)_第1张图片
在节点 c1 开始相交。

示例一:
LeetCode之相交链表(160)、分割链表(725)_第2张图片

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

题目链接
思路分析

题解一:暴力法

  • 对于链表 A 的每个节点,都去链表 B 中遍历一遍找看看有没有相同的节点。
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        if not headA or not headB:
            return None
        pA=headA
        while pA:
            pB=headB
            while pB:
                if pA==pB:
                    return pA
                pB=pB.next
            pA=pA.next           
  • 超出时间限制
  • 时间复杂度: O ( M ∗ N ) O(M * N) O(MN), M, N 分别为两个链表的长度。
  • 空间复杂度: O ( 1 ) O(1) O(1)

题解二:哈希表

  • 先遍历一遍链表 A,用哈希表把每个节点都记录下来(注意要存节点引用而不是节点值)。
  • 再去遍历链表 B,找到在哈希表中出现过的节点即为两个链表的交点。
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        if not headA or not headB:
            return None
        hashmap=set()
        pA=headA
        while pA:
            hashmap.add(pA)
            pA=pA.next
        pB=headB
        while pB:
            if pB in hashmap:
                return pB
            pB=pB.next
        return None
  • 时间复杂度: O ( m + n ) O(m+n) O(m+n)
  • 空间复杂度: O ( m ) O(m) O(m)

题解三:双指针

2、分割链表(725)

题目描述:

【中等】

给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。

这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。

返回一个符合上述规则的链表的列表。

举例: 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ]

示例 1:

输入: 
root = [1, 2, 3], k = 5
输出: [[1],[2],[3],[],[]]
解释:
输入输出各部分都应该是链表,而不是数组。
例如, 输入的结点 root 的 val= 1, root.next.val = 2, \root.next.next.val = 3, 且 root.next.next.next = null。
第一个输出 output[0] 是 output[0].val = 1, output[0].next = null。
最后一个元素 output[4] 为 null, 它代表了最后一个部分为空链表。

题目链接
思路分析

你可能感兴趣的:(leetcode,#,链表,leetcode,链表)