Leetcode0234. 迴文連結串列
阿新 • • 發佈:2020-10-23
234. 迴文連結串列
方法: 快慢指標
主要思路: 使用快慢指標,從第一個位置開始(不是從dummyHead開始),slow最後指向的是靠後中間位置;(類似於二分)
然後我們可以在慢指標移動過程中,將前面一半的連結串列反轉;slow之前的所有節點都以反轉next。
我們獲得前後兩段連線: l1 = prev
和 l2 = next
;
當連結串列為奇數個結點的時候,l2中節點個數比l1多一個;
後續我們只需要判斷一下,當前fast指標是否為null,判斷連結串列節點個數為奇數還是偶數,是奇數則後移一個位置;
在對兩個連結串列是否相等進行進行判斷;
時間複雜度:O(n)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public boolean isPalindrome(ListNode head) { if(head == null || head.next == null) return true; // 兩個都從第一個開始後移;slow指向靠後位置; ListNode slow = head, fast = head; ListNode prev = head; while(fast != null && fast.next != null) { // fast後移; fast = fast.next.next; ListNode next = slow.next; slow.next = prev; prev = slow; slow = next; } //slow之前所有的節點都往前指了; ListNode l1 = prev; ListNode l2 = slow; // 如果fast!= null 則是, 奇數個點,slow指向後面; // 往後移動一位 if(fast != null) { l2 = l2.next; } while(l2 != null) { if(l1.val != l2.val) return false; l2 = l2.next; l1 = l1.next; } return true; } }