❤ 作者主页:李奕赫揍小邰的博客
❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~*
🍊 记得点赞、收藏、评论⭐️⭐️⭐️
📣 认真学习!!!🎉🎉
回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
解法:利用栈的思想
既然是回文,我们就可以想到第一个节点的值和最后一个节点的值一致,第二个节点的值和倒数第二个节点的值一致…以此类推,便可想到利用栈的知识来解决这个问题,可以先新建一个栈,将链表的节点依次全部存放进去。之后链表从头开始,栈也开始出栈,进行比较节点是否相同。
class Solution {
public boolean isPalindrome(ListNode head) {
Stack<ListNode> stack=new Stack<ListNode>();
ListNode left=head,right=head;
while(right!=null){
stack.push(right);
right=right.next;
}
while(left!=null){
ListNode temp=stack.pop();
if(left.val!=temp.val)
return false;
left=left.next;
}
return true;
}
}
排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
解法:归并排序
既然是排序链表,肯定要用到排序的知识,排序无非快排,归并等等。在本题中归并算是比较合适的。
将一个链表拆分为等分的两个链表,排序后再合并在一起。首先拆分两个等分的链表,使用快慢指针,慢指针一次走一个,快指针一次走两个,当快指针到末尾时,慢指针正好在中间。所以以慢指针为界限左右划分。一直划到最小后,开始在两个两个合并,两个有序列表合并在一起,可以参考我之前写的合并两个有序链表 最后得到一个有序的链表。
class Solution {
public ListNode sortList(ListNode head) {
return sortList1(head,null);
}
public ListNode sortList1(ListNode left,ListNode right){
if(left==null)
return left;
if(left.next==right){
left.next=null;
return left;
}
ListNode slow=left,fast=left;
while(fast!=right){
slow=slow.next;
fast=fast.next;
if(fast!=right)
fast=fast.next;
}
ListNode mid=slow;
ListNode list1=sortList1(left,mid);
ListNode list2=sortList1(mid,right);
ListNode sort=merge(list1,list2);
return sort;
}
public ListNode merge(ListNode head1,ListNode head2){
ListNode head=new ListNode(0);
ListNode temp=head;
while(head1!=null&&head2!=null){
if(head1.val<=head2.val){
temp.next=head1;
head1=head1.next;
}else{
temp.next=head2;
head2=head2.next;
}
temp=temp.next;
}
if(head1==null)
temp.next=head2;
else if(head2==null)
temp.next=head1;
return head.next;
}
}