Cracking Coding Interview - 2.2 Return Kth to Last

Return Kth to Last: Implement an algorithm to find the kth to last element of a singly linked list.

解答1

两指针p1和p2,p2比p1多k-1步,两个同时走,当p2到底多时候,p1就是倒数第k个元素

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public Node lastKth(Node head, int k) {
  Node p2 = head;
  while (k - 1 > 0) {
    if (p2 == null) {
      return null;
    }
    p2 = p2.next;
    k--;
  }
  Node p1 = head;
  while (p2.next != null) {
    p1 = p1.next;
    p2 = p2.next;
  }
  return p1;
}

时间复杂度:O(k - 1 + n - k) = O(n)

空间复杂度:O(1)

解答2

用递归,这个问题就变成如何计算每个元素位于倒数第几,最后一个元素位于倒数第1,倒数第二个元素等于前一个元素的位数+1……:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public int lastKth(Node head, int k) {
  if (head == null) {
    return 0;
  }
  int index = lastKth(head, k) + 1;
  if (index == k) {
    print(head);
  }
  return index;
}

不过上面的办法不好,因为它没有返回Node,而是打印出来。看下面这个方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class Index {
  int value;
}
public Node lastKth(Node head, int k, Index index) {
  if (head == null) {
    return null;
  }
  Node node = lastKth(head.next, k, index);
  index.value = index.value + 1;
  if (index.index == k) {
    return head;
  }
  return node;
}

空间复杂度:O(n),每层递归都hold住变量了

时间复杂度:O(n),肯定会从头递归到底。

版权

评论