LeetCode234--回文链表

待我称王封你为后i 2022-11-17 05:14 227阅读 0赞

请判断一个链表是否为回文链表。
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

解法一:

  1. /**
  2. * Definition for a singly-linked list.
  3. * class ListNode {
  4. * public $val = 0;
  5. * public $next = null;
  6. * function __construct($val) { $this->val = $val; }
  7. * }
  8. */
  9. class Solution {
  10. /**
  11. * @param ListNode $head
  12. * @return Boolean
  13. */
  14. function isPalindrome($head) {
  15. $cur = $head;
  16. $arr = [];
  17. while (isset($cur)){
  18. $arr[] = $cur->val;
  19. $cur = $cur->next;
  20. }
  21. $len = count($arr);
  22. for($i=0; $i<floor($len/2); $i++){
  23. if($arr[$i] !== $arr[$len-$i-1]){
  24. return false;
  25. }
  26. }
  27. return true;
  28. }
  29. }

解法二:

快慢指针找中点
使用快慢指针,可以找到链表的中点,就是两个指针开始的时候,都指向第一个元素,之后,往前走,快的指针一次走两步,慢的指针一次走一步,这样的话当快的走到头的时候,慢的正好走到中点位置。 第一步先找到中点,同时将前面的部分反转,然后前面的一半和后面的一半再比较。这样的话,空间复杂度就是O(1)了。

  1. /**
  2. * Definition for a singly-linked list.
  3. * class ListNode {
  4. * public $val = 0;
  5. * public $next = null;
  6. * function __construct($val = 0, $next = null) {
  7. * $this->val = $val;
  8. * $this->next = $next;
  9. * }
  10. * }
  11. */
  12. class Solution {
  13. /**
  14. * @param ListNode $head
  15. * @return Boolean
  16. */
  17. function isPalindrome($head) {
  18. $fast = $head;
  19. $slow = $head;
  20. $prev = null;
  21. $tmp = null;
  22. // 快慢指针遍历找中点的同时,把前部分进行反转
  23. while($fast && $fast->next){
  24. $prev = $slow;
  25. $fast = $fast->next->next;
  26. $slow = $slow->next;
  27. $prev->next = $tmp;
  28. $tmp = $prev;
  29. }
  30. //如果$fast不为空,则节点数为奇数,此时$slow正好是中间位置,需要往后移动一下
  31. if($fast){
  32. $slow = $slow->next;
  33. }
  34. //开始比较,前半部分是$prev指向,后半部分是$slow指向
  35. while($prev && $slow){
  36. if($prev->val != $slow->val){
  37. return false;
  38. }
  39. $prev = $prev->next;
  40. $slow = $slow->next;
  41. }
  42. return true;
  43. }
  44. }

发表评论

表情:
评论列表 (有 0 条评论,227人围观)

还没有评论,来说两句吧...

相关阅读