Reorder List 微软2014校园招聘笔试题

来源:互联网 发布:网络小贷和p2p的区别 编辑:程序博客网 时间:2024/06/03 10:10

Given a singly linked list L: L0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-2→…

You must do this in-place without altering the nodes' values.

For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.

这个题是微软2014校园招聘笔试题,也是leetcode 一道经典题。这篇博文我用一个很笨的方法实现了这道题:

http://blog.csdn.net/huruzun/article/details/28456403

今天再次碰到这个题尝试用更好的方法进行实现,算法思想:把链表分为两部分,后面部分进行链表逆置,然后进行两个链表合并。

public class Solution {    public void reorderList(ListNode head) {if(head==null || head.next==null){return ;}ListNode slow = head;ListNode fast = head;// fast slow 步伐不同链表分为前后两部分while(fast!=null && fast.next!=null){slow = slow.next;fast = fast.next.next;}ListNode reverseListNode = reverse(slow.next);slow.next = null;ListNode cur = head;// 合并前后两条链表while(reverseListNode!=null){ListNode temp = reverseListNode.next;reverseListNode.next = cur.next;cur.next = reverseListNode;cur = cur.next.next;reverseListNode = temp;}}public ListNode reverse(ListNode head){if(head == null || head.next ==null){return head;}ListNode pre = null;ListNode cur = head;ListNode next = null;while(cur!=null){next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}}

0 0
原创粉丝点击