首页 > 其他 > 详细

leetcode 143. 重排链表

时间:2021-04-29 18:15:36      阅读:22      评论:0      收藏:0      [点我收藏+]

给定一个单链表 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;
    }

技术分享图片

leetcode 143. 重排链表

原文:https://www.cnblogs.com/wangzaiguli/p/14718431.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!