Reverse LinkedList兩種解法
阿新 • • 發佈:2018-12-30
Facebook店面第一輪就掛了,先問了簡歷, 然後問了reverse linked list的兩種解法以及分析,先用了recursive寫,然後說要space O(1),寫太慢了, 只寫了這道題和follow up
法一:指標,時間 O(n), 空間 O(1) 由於reverse需要兩個指標指向當前的reverse的兩個node,因此需要兩個指標,同時又需要一個指標指向後一個node來防止丟失後面的list,因此至少需要三個指標。 corner case: 1. list為空/list只有一個node:直接返回node; 2. list只有兩個node: 可以包含在主體程式碼裡,當第三個指標為null時結束返回。 example: 1 -> 2 -> 3 -> 4 1 , 2, 3 code: public ListNode reverseLinkedList(ListNode root) { if (root == null || root.next == null) return root; ListNode first = root; ListNode second = root.next; ListNode third = root.next.next; first.next = null; while (third != null) { second.next = first; first = second; second = third; third = third.next; } second.next = first; return second; }
法二:遞迴,時間 O(n), 空間 O(n) 假設1~n-1已經全部完成,那麼1 -> 2 -> 3 -> 4 ------> 3-> 2 -> 1 -> null 和 4。因此,我們就把4加在3前面即可。 corner case:和上一樣 code: public ListNode reverseLinkedList(ListNode root) { if (root == null || root.next == null) return root; ListNode cur = root; while (cur.next != null) { cur = cur.next; } helper(root, root.next); return cur; } public void helper(ListNode first, ListNode second) { if (second == null) return first; helper(second, second.next); first.next = second.next; second.next = first; }