標籤:
Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
https://leetcode.com/problems/palindrome-linked-list/
判斷單鏈表是否為迴文,要求時間複雜度O(n),空間複雜度O(1)。
如果對空間複雜度沒有要求,有兩種簡單的做法。
一種是開個數組,把鏈表裡的值挨個塞進去,然後雙指標。
還有一種是做一輪遍曆,把單鏈表變成雙鏈表(javasrcipt可以修改執行個體化的對象), 然後雙指標。
時間複雜度O(n),空間複雜度O(1)的解法:
1.第一輪遍曆用快慢指標(快指標每次走兩步,慢指標每次走一步)尋找中點 -> O(n)
2.反轉後半段鏈表 -> O(n/2)
3.比較 -> O(n/2)
合起來時間還是O(n)。
你確定這是easy?
1 /** 2 * Definition for singly-linked list. 3 * function ListNode(val) { 4 * this.val = val; 5 * this.next = null; 6 * } 7 */ 8 /** 9 * @param {ListNode} head10 * @return {boolean}11 */12 var isPalindrome = function(head) {13 //find middle14 var slow = head, fast = head, cacheHead = head;15 while(fast !== null && fast.next !== null){16 slow = slow.next;17 fast = fast.next.next;18 }19 20 //reverse link list21 var list2Head = new ListNode("head"), tmp;22 while(slow !== null){23 tmp = slow;24 slow = slow.next;25 tmp.next = list2Head.next;26 list2Head.next = tmp;27 }28 29 //judge palindrom30 var list1 = cacheHead, list2 = list2Head.next;31 for(; list2 !== null; list1 = list1.next, list2 = list2.next){32 if(list1.val !== list2.val){33 return false;34 }35 }36 return true;37 };
[LeetCode][JavaScript]Palindrome Linked List