本专题记录所有链表相关必刷题
链表的题目一般建立虚拟头节点度dumy后会容易处理
21 合并两个有序链表
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode dumy=new ListNode(-1);
ListNode p=dumy;
ListNode p1=list1,p2=list2;
while(p1!=null && p2!=null){
if(p1.val<=p2.val){
p.next=p1;
p1=p1.next;
}else{
p.next=p2;
p2=p2.next;
}
p=p.next;
}
if(p1==null) p.next=p2;
if(p2==null) p.next=p1;
return dumy.next;
}
86 分隔链表
public ListNode partition(ListNode head, int x) {
ListNode dumy1=new ListNode();
ListNode dumy2=new ListNode();
ListNode p1=dumy1,p2=dumy2,p=head;
while(p!=null){
if(p.val<x){
p1.next=p;
p1=p1.next;
}else{
p2.next=p;
p2=p2.next;
}
ListNode temp=p.next;
p.next=null;
p=temp;
}
p1.next=dumy2.next;
return dumy1.next;
}
合并K个升序链表
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0) return null;
ListNode dumy=new ListNode(-1);
ListNode p=dumy;
//优先级队列,主要考察优先队列的使用手法(小根堆)
PriorityQueue<ListNode> pq=new PriorityQueue<ListNode>(
lists.length,(a,b)->(a.val-b.val));
for(ListNode head:lists){
if(head!=null){
pq.add(head);
}
}
while(pq.size()!=0){
ListNode node=pq.poll();
p.next=node;
if(node.next!=null){
pq.add(node.next);
}
p=p.next;
}
return dumy.next;
}
19 删除链表的倒数第 N 个结点
public ListNode removeNthFromEnd(ListNode head, int n) {
//用dumy不用head,可以防止删除第一个节点时空指针异常
ListNode dumy=new ListNode(-1);
dumy.next=head;
//先找到到倒数第k+1个
ListNode p1=dumy;
for(int i=0;i<n+1;i++){
p1=p1.next;
}
ListNode p2=dumy;
while(p1!=null){
p1=p1.next;
p2=p2.next;
}
p2.next=p2.next.next;
return dumy.next;
}
链表的中间节点
public ListNode middleNode(ListNode head) {
ListNode slow=head;
ListNode fast=head;
while(fast!=null && fast.next!=null){
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
判断是否有环
public boolean hasCycle(ListNode head) {
ListNode slow=head,fast=head;
while(fast!=null && fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(fast==slow){
return true;
}
}
return false;
}
142 环形链表返回起点
public ListNode detectCycle(ListNode head) {
ListNode slow=head,fast=head;
while(fast!=null && fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(fast==slow){
break;
}
}
if(fast==null || fast.next==null){
return null;
}
slow=head;
while(slow!=fast){
slow=slow.next;
fast=fast.next;
}
return slow;
}
160 相交链表
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1=headA,p2=headB;
while(p1!=p2){
if(p1==null) p1=headB;
else p1=p1.next;
if(p2==null) p2=headA;
else p2=p2.next;
}
return p1;
}