【LeetCode】Reorder List
2014-11-18 20:22
344 查看
方法1:利用map<curNode,preNode> 获取节点的上一个节点为O(l).
方法2:获取后半段链表,然后反转,最后与前半段合并
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public void reorderList(ListNode head) { if(head == null || head.next == null) return ; Map<ListNode, ListNode>map = new HashMap<>(); ListNode dummy = new ListNode(-1); dummy.next = head; ListNode pre = null,end = null; while(head != null){ map.put(head ,pre); pre = head; head = head.next; } end = pre; head = dummy.next; ListNode newHead = new ListNode(-1); boolean flag = false; while(head != null && end != null && head != end){ newHead.next = head; newHead = newHead.next; //System.out.print(newHead.val + " "); head = head.next; newHead.next = end; newHead = newHead.next; //System.out.print(newHead.val + " "); if(head == end){ // flag = true; break; } end = map.get(end); } if(!flag){ newHead.next = head; newHead = newHead.next; //System.out.print(newHead.val + " *"); newHead.next = null; } else{ newHead.next = null; } } }
方法2:获取后半段链表,然后反转,最后与前半段合并
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode reverseList(ListNode head){ if(head == null || head.next == null)return head; ListNode pre = null, cur = head, next = head.next; while(next != null){ cur.next = pre; pre = cur; cur = next; next = next.next; } cur.next = pre; return cur; } public ListNode getMiddleNode(ListNode head){//获取中间节点,保证前半段长度大于等于后半段长度 ListNode dummy = head; ListNode fast = dummy, low = dummy, pre = null; while(fast.next != null && fast.next.next != null){ low = low.next; fast = fast.next.next; } ListNode middle = low.next; low.next = null; return middle; } public ListNode mergeTwoList(ListNode h1, ListNode h2){ ListNode dummy = new ListNode(-1); ListNode p = dummy; while(h2 != null ){ p.next = h1; p = p.next; h1 = h1.next;//需要先指过来,要不然得不到h1.next的信息 p.next = h2; p = p.next; h2 = h2.next; } p.next = h1; return dummy.next; } public void reorderList(ListNode head) { if(head == null || head.next == null) return ; ListNode middle = getMiddleNode(head); mergeTwoList(head, reverseList(middle)); } /** * 1 2 3 4 最先开始 slow指向2,fast指向3 * / }
相关文章推荐
- leetcode - Reorder List
- [LeetCode] Reorder List
- [LeetCode] Reorder List
- LeetCode题解–143. Reorder List
- Leetcode: Reorder List
- leetcode -- Reorder List
- leetcode 【 Reorder List 】python 实现
- LeetCode Reorder List
- 【leetcode】【单链表】【143】Reorder List
- leetcode:Reorder List (修改链表排列不改变值) 【面试算法题】
- LeetCode Reorder List
- leetcode 日经贴,Cpp code -Reorder List
- Reorder List 链表首尾交叉排列@LeetCode
- 【LeetCode】Reorder List
- LeetCode(143) Reorder List
- leetcode || 143、Reorder List
- leetcode reorder-list(java实现)
- leetcode--Reorder List
- Reorder List - Leetcode
- leetcode刷题6:对单链表重新排序--reorder list