1. 解题思路
一般链表题,我们都可以考虑双指针的解题思路,此题同样可以。首先注意题目描述里这句👇
“如果该链表长度小于k,请返回一个长度为 0 的链表。” 意味着如果链表为空,那么直接返回None即可。
然后结合示例1,继续分析:
- 首先创建两个指针,指向头部节点:
- 然后根据k值,移动first指针走k步,所以示例会进行如下移动:
- 接着first走完k步后,first和second开始同步指针移动:
最后直到first到null位置,此时second的位置就是本题要求的。
2. 核心代码
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param pHead ListNode类 # @param k int整型 # @return ListNode类 # class Solution: def FindKthToTail(self , pHead , k ): # write code here #首先初始化两个指针,都指向头节点 first, second = pHead, pHead #当first不存在的时候,直接返回None for i in range(k): if first == None: return None #否则节点存在,开始移动first指针走动k步 first = first.next #当first走完k步后,此时first、second指针开始同步移动,当first移出链表到null的位置,second指针停止移动;此时返回second指针所在位置就是我们要找的倒数最后K个节点值 while first: first = first.next second = second.next return second
3. 复杂度分析
- 时间复杂度: (n 为链表的长度,first走了n步,second走了(n - k)步)
- 空间复杂度: (双指针使用常数大小的额外空间)
-------------------------------------------我是解法二的分割线---------------------------------------------------
4. 解法二
4.1 思路
利用数组的切片规则直接获取倒数的k个节点。(就是这么简单😂)
4.2 核心代码
# class ListNode: # def __init__(self, x): # self.val = x # self.next = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param pHead ListNode类 # @param k int整型 # @return ListNode类 # class Solution: def FindKthToTail(self , pHead , k ): # write code here #创建一个空数组 list = [] #当节点存在时,依次添加节点到数组中 while pHead: list.append(pHead) pHead = pHead.next #根据题目描述,当k大于数组长度的时候或k为0 的时候,返回None if k > len(list) or k == 0: return None else: #否则根据切片规则返回倒数K个节点 return list[-k]
4.3 复杂度分析
- 时间复杂度: (n 为链表的长度,遍历链表所需时间)
- 空间复杂度: (创建了一个额外数组,与链表大小一样为n)