2022-2-15剑指offer day5

题1:

JZ23 链表中环的入口结点

描述

给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
 
数据范围: n\le10000n10000,1<=结点值<=100001<=<=10000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
 
例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示:
可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。
 

输入描述:

输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表

返回值描述:

返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。
 1 /*
 2  public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }
10 */
11 public class Solution {
12 
13     public ListNode EntryNodeOfLoop(ListNode pHead) {
14         ListNode fast=pHead,slow=pHead;
15         while (fast!=null&&fast.next!=null) {
16             fast=fast.next.next;
17             slow=slow.next;
18             if (slow==fast) break;
19         }
20         if (fast==null||fast.next==null) return null;
21         fast=pHead;
22         while (fast!=slow) {
23             fast=fast.next;
24             slow=slow.next;
25         }
26         return fast;
27     }
28 }

思路:快慢指针必定相遇。此外一个从相遇点出发,一个从起点出发必定在环入口相遇。

题2:

JZ22 链表中倒数最后k个结点

 

描述

输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
 
 
数据范围:0 \leq n \leq 10^50n105,0 \leq a_i \leq 10^90ai109,0 \leq k \leq 10^90k109
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
 
例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:
 
其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。
 
 1 import java.util.*;
 2 
 3 /*
 4  * public class ListNode {
 5  *   int val;
 6  *   ListNode next = null;
 7  *   public ListNode(int val) {
 8  *     this.val = val;
 9  *   }
10  * }
11  */
12 
13 public class Solution {
14     /**
15      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
16      *
17      * 
18      * @param pHead ListNode类 
19      * @param k int整型 
20      * @return ListNode类
21      */
22     public ListNode FindKthToTail (ListNode pHead, int k) {
23         // write code here
24         ListNode point=pHead;
25         int size=0;
26         while (point!=null) {
27             size++;
28             point=point.next;
29         }
30         if (size<k) return null;
31         for (int i=0;i<size-k;i++) {
32             pHead=pHead.next;
33         }
34         return pHead;
35     }
36 }

思路:相当于正数size-k个节点。最佳方案双指针,一个先走k步,一个再走,快的走到头了慢的就是结果。

posted on 2022-02-15 12:02  阿ming  阅读(22)  评论(0)    收藏  举报

导航