leetcode 143. 重排链表

给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:

给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

分三步

1,用双指针找到中点

2,中点后面的链表反转

3,两个链表交替取值,知道某一个为null或者相等。

    public void reorderList(ListNode head) {
        if (head == null || head.next == null || head.next.next == null) {
            return;
        }
        // 寻找中点
        ListNode a = head;
        ListNode b = head;

        while (b != null && b.next != null) {
            a = a.next;
            b = b.next.next;
        }
        b = reverse(a);
        a = head;
        ListNode node = new ListNode(0);
        while (a != null && b != null) {
            if (a == b) {
                node.next = a;
                break;
            } else {
                node.next = a;
                a = a.next;
                node.next.next = b;
                b = b.next;
                node = node.next.next;
            }
        }
    }

    // 反转
    private static ListNode reverse (ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode reverse = reverse(head.next);
        head.next.next = head;
        head.next = null;
        return reverse;
    }

posted @ 2021-04-29 16:14  旺仔古李  阅读(76)  评论(0编辑  收藏  举报