题目描述1
笔者解答1.1
public class Solution {
public ListNode detectCycle(ListNode head) {
Map<ListNode,Integer> map=new HashMap<>();
while(head!=null){
if(!map.containsKey(head)){
map.put(head,1);
}else{
return head;
}
head=head.next;
}
return null;
}
}
笔者分析1.2
用哈希表来做的话很快就能解出来,但是时空效率有点低。这题原来考虑过用快慢指针,但没有发现规律就放弃了,后来想想还是可以写的,但前提是一定要用图来辅助理解,不然很难想到。思路如下图所示:
先用快慢指针找到第一次相遇点,因为块指针速度是慢指针的两倍,所以慢指针走了La+Lb长度时,快指针走了2*(La+Lb)所以从慢指针从相遇点继续走La便能走到环的路口,和从起点走到环路口是同一时间,只要从起点和相遇点同时往下走,走到第一次相遇点便是环入口。代码如下:
//步骤一:使用快慢指针判断链表是否有环
ListNode p=head,p2=head;
boolean hasCycle=false;
while(p2.next!=null&&p2.next.next!=null){
p=p.next;
p2=p2.next.next;
if(p==p2){
hasCycle=true;
break;
}
}
//步骤二:若有环,找到入环开始的节点
if(hasCycle){
ListNode q=head;
while(p!=q){
p=p.next;
q=q.next;
}
return q;
}else
return null;
题目描述2
笔者分析2.1
这题思路还是挺简单的,但有个很值得注意的地方,就是while(head!=null)部分,如果刚开始声明了其它指向head节点的引用,并要对该引用修改,那么在while循环里很容易就构成死循环。解决方法是另外创建一个头指针,ListNode dummyHead1=new ListNode(0),是不是非常巧妙
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode dummyHead1 = new ListNode(0);
ListNode dummyHead2 = new ListNode(0);
ListNode node1 = dummyHead1;
ListNode node2 = dummyHead2;
while (head != null) {
if (head.val < x) {
node1.next = head;
head = head.next;
node1 = node1.next;
node1.next = null;
} else {
node2.next = head;
head = head.next;
node2 = node2.next;
node2.next = null;
}
}
node1.next = dummyHead2.next;
return dummyHead1.next;
}
}
题目描述3
笔者解答3.1
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null||head.next==null)return head;
ListNode temp_head=new ListNode(0);
ListNode result=temp_head;
int last=1;
while(head.next!=null){
if(head.next.val==head.val){
last++;
}else{
if(last==1){
temp_head.next=head;
temp_head=temp_head.next;
}
last=1;
}
if(head.val!=head.next.val&&head.next.next==null){
temp_head.next=head.next;
temp_head=temp_head.next;
}
head=head.next;
}
temp_head.next=null;
return result.next;
}
}
笔者分析3.2
这里说一些自己在调bug时发现的问题,如果新建了一个哨兵结点,后接主链表中满足特定要求的结点,最后一定要加上temp_head.next=null,不然会多一个很长的主链后缀,这里要切断。
总结
链表配哈希表,美滋滋,每日打卡二十五天,以下图为证