leetcode题解-143. Reorder List

来源:互联网 发布:登陆淘宝网 编辑:程序博客网 时间:2024/05/16 04:52

题意:给定一个链表,把最后一个结点插入到第1个结点后,倒数第二个结点插入到第2个结点后,倒数第三个结点插入到第3个结点后,以此类推……注意:需要在原数组上进行操作,同时不能改变链表的value。

例子:
给定链表: L0→L1→…→Ln-1→Ln,
返回链表: L0→Ln→L1→Ln-1→L2→Ln-2→…

给定链表 1->2->3->4->5->6
返回链表 1->6->2->5->3->4

分析:
当链表的题做多了以后,分析问题的思路就会很清晰。首先,Ln,Ln-1,Ln-2是不会有顺序的,所以我们需要从链表中点往后逆序,然后再将把中点后第1个结点插入到第1个结点后,把中点后第2个结点插入到第2个结点后,即:

1->2->3->4->5->6
1->2->3->6->5->4
1->6->2->5->3->4

因为不涉及到头节点的改变,所以不用声明dummyNode,代码为:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */class Solution {     public ListNode reorderList(ListNode head) {        if(head == null || head.next == null) return head;        ListNode fastNode = head;        int len = 0;        // 得到链表的长度        while(fastNode != null){            len++;            fastNode = fastNode.next;        }        // 找到中点        ListNode pre = head;        for(int i = 0; i < (len - 1) / 2; i++){            pre = pre.next;        }        // 将中点后的链表逆序        fastNode = pre.next.next;        ListNode slowNode = pre.next;        while(fastNode != null){            slowNode.next = fastNode.next;            fastNode.next = pre.next;            pre.next = fastNode;            fastNode = slowNode.next;        }        // 将把中点后第1个结点插入到第1个结点后,把中点后第2个结点插入到第2个结点后...        fastNode = pre.next;        slowNode = head;        pre.next = null;        for(int i = 0; i < len / 2; i++){            ListNode temp = fastNode.next;            fastNode.next = slowNode.next;            slowNode.next = fastNode;            slowNode = fastNode.next;            fastNode = temp;        }        return head;    }}