C#LeetCode刷题之#234-回文链表(Palindrome Linked List)

C#LeetCode刷题之#234-回文链表(Palindrome Linked List)

问题

请判断一个链表是否为回文链表。

输入: 1->2

输出: false

输入: 1->2->2->1

输出: true

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

Given a singly linked list, determine if it is a palindrome.

Input: 1->2

Output: false

Input: 1->2->2->1

Output: true

Follow up:
Could you do it in O(n) time and O(1) space?

示例

public class Program {

    public static void Main(string[] args) {
        var head = new ListNode(1) {
            next = new ListNode(2) {
                next = new ListNode(3) {
                    next = new ListNode(2) {
                        next = new ListNode(1)
                    }
                }
            }
        };

        var res = IsPalindrome(head);
        Console.WriteLine(res);

        res = IsPalindrome2(head);
        Console.WriteLine(res);

        Console.ReadKey();
    }

    private static bool IsPalindrome(ListNode head) {
        var list = new List<int>();
        var node = head;
        while(node != null) {
            list.Add(node.val);
            node = node.next;
        }
        var mid = list.Count / 2;
        for(var i = 0; i < mid; i++) {
            if(list[i] != list[list.Count - i - 1]) return false;
        }
        return true;
    }

    private static bool IsPalindrome2(ListNode head) {
        var list = new List<int>();
        var list2 = new List<int>();
        var node = head;
        while(node != null) {
            list.Add(node.val);
            list2.Add(node.val);
            node = node.next;
        }
        list.Reverse();
        for(var i = 0; i < list.Count; i++) {
            if(list[i] != list2[i]) return false;
        }
        return true;
    }

    public class ListNode {
        public int val;
        public ListNode next;
        public ListNode(int x) { val = x; }
    }

}

以上给出2种算法实现,以下是这个案例的输出结果:

True
True

分析:

显而易见,以上2种算法的时间复杂度均为: O(n)

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/3905

发表评论

登录后才能评论