题目传送门

方法一:(原地修改)
题目要求原地修改(不创建新链表节点,直接调整指针)进行合并链表
java
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连接h2
h2.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;
}
}
方法二:(新建链表合并链表)
java
/**
* 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;
}
}
