题目描述
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
1 2
| 输入:head = [1,2,2,1] 输出:true
|
解题思路
- 使用栈遍历
执行用时:36 ms, 在所有 Java 提交中击败了5.73%的用户
内存消耗:58.2 MB, 在所有 Java 提交中击败了21.65%的用户
通过测试用例:88 / 88
时间 O(2n)
空间 O(n) 使用了栈存储数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
class Solution { public boolean isPalindrome(ListNode head) { Stack<Integer> s=new Stack(); ListNode tmp=head,tmp2=head; while(tmp!=null){ s.push(tmp.val); tmp=tmp.next; } while(tmp2!=null){ if(tmp2.val!=s.pop()){ return false; } tmp2=tmp2.next; } return true; } }
|
- 要想使得空间为O(1),就需要改变输入,主要步骤为
- 找到前半部分链表的尾结点
- 翻转后半部分链表
- 双指针同时向后移动,比较,判断是否为回文
- // 恢复链表
- 返回结果
执行用时:8 ms, 在所有 Java 提交中击败了39.41%的用户
内存消耗:51.4 MB, 在所有 Java 提交中击败了96.77%的用户
通过测试用例:88 / 88
时间 O(n)
空间 O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
class Solution { public boolean isPalindrome(ListNode head) { int num=0; ListNode tmp=head; while(tmp!=null){ num++; tmp=tmp.next; } tmp = head; for(int i=0;i<num/2;i++){ tmp=tmp.next; } ListNode right=reverseList(tmp); while (right!=null){ if(head.val!=right.val){ return false; } head=head.next; right=right.next; } return true; } public ListNode reverseList(ListNode head) { ListNode res=new ListNode(); while(head!=null){ ListNode tmp=head.next; head.next=res.next; res.next=head; head=tmp; } return res.next; } }
|