剑指Offer22.链表中倒数第k个节点Java
题目描述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点
输入输出样式
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
本题来自LeetCode:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/
思路
用快慢双指针low和high都指向头结点,让high先走k - 1步,随后low和high同时移动,直到high到链表尾部,则low与high间隔k - 1,即为倒数第k个节点。
除此之外,还可以先遍历链表得出节点总数n,再遍历一次链表直到n - k的节点位置。
算法分析
时间复杂度O(n),空间复杂度为O(1)
求解函数
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode low = head, high = head;
for (int i = 1; i < k; ++i) {
if (high.next == null) {
return null;
}
high = high.next;
}
while (high.next != null) {
low = low.next;
high = high.next;
}
return low;
}