Leetcode #234 - 회문 연결 목록
7483 단어 algorithmsjavascript
방법 1: 값 배열 만들기
연결 목록의 구조는 목록의 전체 크기에 대한 액세스를 제공하지 않습니다. 이 문제를 해결하기 위해 목록을 반복하고 노드 값을 배열에 푸시할 수 있습니다. 이 시점에서 우리는 배열의 길이에 접근할 수 있고 단일 포인터
i
를 사용하여 배열에서 서로 반대되는 값을 비교할 수 있습니다.var isPalindrome = function(head) {
let values = []
// push all node values into an array
while (head !== null) {
values.push(head.val)
head = head.next
}
// iterate over array and compare values
for (let i = 0; i < values.length >> 1; i++) {
// (values.length - i - 1) is our virtual pointer
if (values[i] !== values[values.length - i - 1]) return false
}
return true
};
이 방법의 시간 및 공간 복잡도는
O(n)
방법 2: 제자리에서 후반 반전
fast
및 slow
포인터를 사용하여 각각 목록의 중앙과 끝으로 이동할 수 있습니다. 중심을 결정할 수 있게 되면 slow
포인터를 사용하여 목록의 후반부를 역으로 다시 연결합니다. 나는 이 방법을 뱀을 잡고 꼬리를 머리로 바꾸는 것으로 개념화하고, 그 결과 가운데에 꼬리가 있는 머리가 둘 달린 뱀(ListNode.next = null
)이 생깁니다.var isPalindrome = function(head) {
if (head === null || head.next == null) return true
let slow = head
let fast = head
while (fast !== null && fast.next !== null) {
fast = fast.next.next
slow = slow.next
}
// if list length is odd, move slow over one to start
// the second half of the list
if (fast) {
slow = slow.next
}
// reverse the second half of the list
slow = reverse(slow)
fast = head
// check for palindromicity
while (slow) {
if (slow.val !== fast.val) {
return false
}
slow = slow.next
fast = fast.next
}
return true
}
function reverse(head) {
let prev = null
let next;
while (head) {
next = head.next
head.next = prev
prev = head
head = next
}
return prev
}
추가 배열을 생성하지 않기 때문에 시간 복잡도는
O(n)
이고 공간 복잡도는 O(1)
입니다.
Reference
이 문제에 관하여(Leetcode #234 - 회문 연결 목록), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/forksofpower/leetcode-234-palindrome-linked-list-22oa텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)