美文网首页
链表--返回倒数第k个结点

链表--返回倒数第k个结点

作者: Pig_deng饲养员 | 来源:发表于2020-08-31 20:28 被阅读0次

    题目

    返回倒数第k个结点 leetcode 面试题02.02
    实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

    示例:
    输入:1->2->3->4->5和k=2
    输出:4

    思路

    数组/栈 方法

    这个方法比较简单,但是会占用额外空间。
    如果用数组,迭代的获取链表中的值将其存储在数组中,然后获取倒数第K个结点即可。
    如果用栈,迭代的获取链表中的值将其存储在栈中,然后依次出栈k次即可。
    时间复杂度O(n)
    空间复杂度O(n)

    快慢指针法

    使用双指针来解决,首先定义快慢指针都在头结点,然后快指针先走k步,然后快慢指针同时走直到快指针走到空结点,此时慢指针即为倒数第k个结点。
    解析:

    1. (slow)(fast)1->2->3->4->5->null slow=fast=1
    2. (slow)1->2->3(fast)->4->5->null 快指针走两步到3,慢指针仍然在1
    3. 1->2->3->4(slow)->5->null(fast) 当快指针到达空结点时,慢指针自然在倒数第2个结点4上。

    时间复杂度O(n)
    空间复杂度O(1)

    c++代码
    int kthToLast(ListNode* head, int k) {
            ListNode *slow=head,*fast=head;
            while(k--){
                fast = fast->next;
            }
            while(fast != NULL){
                slow = slow->next;
                fast = fast->next;
            }
    
            return slow->val;
        }
    
    python3代码
    class Solution:
        def kthToLast(self, head: ListNode, k: int) -> int:
            fast,slow = head,head
    
            while k != 0:
                fast = fast.next
                k = k-1
            
            while fast is not None:
                fast = fast.next
                slow = slow.next
            
            return slow.val
    

    相关文章

      网友评论

          本文标题:链表--返回倒数第k个结点

          本文链接:https://www.haomeiwen.com/subject/mfypsktx.html