• LC.143.Reorder List


    https://leetcode.com/problems/reorder-list/description/
    Given a singly linked list L: L0→L1→…→Ln-1→Ln,
    reorder it to: L0→Ln→L1→Ln-1→L2→Ln-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}.
    time: o(n) space: o(1)


     1 public void reorderList(ListNode head) {
     2         if (head == null || head.next == null) return;
     3         ListNode mid = null;
     4         ListNode l1 = head;
     5         // step 1: find the mid
     6         mid = findMid(head);
     7         ListNode l2 = mid.next ;
     8         //重要!断开中点和后一段
     9         mid.next = null;
    10         //step 2: reverse the 2nd half
    11         ListNode l2Reverse = reverse(l2);
    12         //step 3: merge with the 1st with the 2nd
    13         merge(l1, l2Reverse);
    14     }
    15 
    16     //去中点
    17     private ListNode findMid(ListNode head){
    18         ListNode fast = head, slow = head;
    19         while (fast != null && fast.next != null && fast.next.next != null) {
    20             fast = fast.next.next;
    21             slow = slow.next;
    22         }
    23         return slow ;
    24     }
    25 
    26     //reverse
    27     private ListNode reverse(ListNode head) {
    28         if (head == null || head.next == null) return head;
    29         ListNode pre = null;
    30         ListNode curr = head;
    31         while (curr != null) {
    32             ListNode temp = curr.next;
    33             curr.next = pre;
    34             pre = curr;
    35             curr = temp;
    36         }
    37         return pre;
    38     }
    39 
    40     //合并
    41     private ListNode merge(ListNode head1, ListNode head2) {
    42         ListNode curr1 = head1, curr2 = head2, temp1 = null, temp2 = null;
    43         while (curr1.next != null && curr2 != null) {
    44             temp1 = curr1.next;
    45             temp2 = curr2.next;
    46             curr1.next = curr2;
    47             curr2.next = temp1;
    48             curr1 = temp1;
    49             curr2 = temp2;
    50         }
    51         if (curr2 != null) {
    52             curr1.next = curr2;
    53             curr2.next = null;
    54         }
    55         else {
    56             curr1.next = null;
    57         }
    58         return head1;
    59     }
  • 相关阅读:
    Linux编辑器- vi / vim
    Java使用POI对Excel进行基本操作(4)-Excel中绘制图片
    Java使用POI对Excel进行基本操作(3)-合并单元格
    Java使用POI对Excel进行基本操作(2)-基本操作和样式设置
    Java使用POI对Excel进行基本操作(1)-概述和maven依赖
    Linux之docker搭建
    docker的个人理解
    python接口自动化-requests-toolbelt处理multipart/form-data
    python3.6安装lxml库
    pytest之assert断言
  • 原文地址:https://www.cnblogs.com/davidnyc/p/8471203.html
Copyright © 2020-2023  润新知