【LeetCode100】--- 101.重排链表【思维导图+复习回顾】
题目传送门

方法一:(原地修改)
题目要求原地修改(不创建新链表节点,直接调整指针)进行合并链表
class Solution {public void reorderList(ListNode head) {if(head == null || head.next == null){return;}ListNode slow = head;ListNode fast = head;
//寻找链表中心节点while(fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;}ListNode head2 = reverseList(slow.next);slow.next = null;ListNode dummy = new ListNode(0);ListNode prev = dummy;boolean flag = true;ListNode h1 = head;ListNode h2 = head2;
//合并链表while(h1 != null && h2 != null){ListNode next1 = h1.next; // 保存h1的下一个节点ListNode next2 = h2.next; // 保存h2的下一个节点h1.next = h2; // h1连接h2h2.next = next1; // h2连接h1的原下一个节点h1 = next1; // 移动h1指针h2 = next2; // 移动h2指针}}
//反转链表public ListNode reverseList(ListNode slow){ListNode dummy = new ListNode(0);ListNode prev = dummy;while(slow != null){ListNode next = slow.next;slow.next = prev.next;prev.next = slow;slow = next;}return prev.next;}
}
方法二:(新建链表合并链表)
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public void reorderList(ListNode head) {if(head == null || head.next == null){return;}ListNode slow = head;ListNode fast = head;while(fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;}ListNode head2 = reverseList(slow.next);slow.next = null;ListNode dummy = new ListNode(0);ListNode prev = dummy;boolean flag = true;ListNode h1 = head;ListNode h2 = head2;while(h1 != null || h2 != null){if(flag == true && h1 != null){prev.next = new ListNode(h1.val);h1 = h1.next;prev = prev.next;flag = false;}else if(h2 != null){prev.next = new ListNode(h2.val);h2 = h2.next;prev = prev.next;flag = true;}}//head = dummy.next;这样不对是因为//两个引用彻底指向不同对象,修改head的指向和originalHead无关head.next = dummy.next.next;}public ListNode reverseList(ListNode slow){ListNode dummy = new ListNode(0);ListNode prev = dummy;while(slow != null){ListNode next = slow.next;slow.next = prev.next;prev.next = slow;slow = next;}return prev.next;}
}

