您的位置:首页 > 其它

【LeetCode】Reorder List

2014-11-18 20:22 344 查看
方法1:利用map<curNode,preNode> 获取节点的上一个节点为O(l).

/**
* 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
* /

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: