扫码关注公众号
将两个升序链表合并为一个新的有序链表并返回,新链表是通过拼接给定的两个链表的所有节点组成
递归实现functionmergeList(l1,l2){if(l1==null)returnl2if(l2==null)returnl1if(l1.val<=l2.val){l1.next=mergeList(l1.next,l2)returnl1}else{l2.next=mergeList(l2.next,l1)returnl2}}
给定一个带有头节点head的非空链表,返回中间节点。如果有两个中间节点,则返回第二个中间节点。求链表的中间节点
解题思路:快慢指针法,慢指针走一步,快指针走两步,当快指针走到终点时,慢指针刚好指向中间节点varmidleNode=function(head){letfast=headletslot=headwhile(fast&&fast.next){slot=slot.nextfast=fast.next.next}returnslot}
删除链表倒数第n个节点
解题思路:同样也是快慢指针,只不过快指针提前走n+1步,还得判断一种特殊情况,就是n是不是和链表的长度相等varremoveList=function(head,n){letfast=head;letslot=head;while(--n){fast=fast.next;//先走n步}//判断链表的长度是不是n,如果刚好走了n步,没有下一个节点,就删除第一个节点并返回if(!fast.next)returnhead.next//如果不是,快指针就再走一步,比慢指针提前走n+1步fast=fast.next//快慢指针一起前进while(fast&&fast.next){fast=fast.nextslot=slot.next}slot.next=slot.next.nextreturnhead}
判断一个链表是否是回文链表
思路:将链表分成两段,然后将后面一段进行翻转,在逐项进行比较。classSolution{publicbooleanisPalindrome(ListNodehead){if(head==null||head.next==null){returntrue;}ListNodetemp=head;ListNodetemp2=head;//只有两个数字时,后面一段的链表是第二个ListNodetemp1=head.next;intlen=0;//遍历出链表有效数字while(temp!=null){temp=temp.next;len++;}for(inti=0;i<len/2-1;i++){temp2=temp2.next;temp1=temp1.next;}//分成两部分temp2.next=null;//有效数字是奇数个,后一段的链表在往后移一位if(len%2!=0){temp1=temp1.next;}returnisEqual(head,reverse(temp1));}//翻转链表privateListNodereverse(ListNodehead){ListNodenewHead=null;while(head!=null){ListNodenextNode=head.next;head.next=newHead;newHead=head;head=nextNode;}returnnewHead;}//逐个判断是否相等privatebooleanisEqual(ListNodel1,ListNodel2){while(l1!=null&&l2!=null){if(l1.val!=l2.val)returnfalse;l1=l1.next;l2=l2.next;}returntrue;}}