leetcode143
原来是l0->l1->ln-1->ln的链表现在需要重新排序,本质是一头一尾的平凑起来.
因为是单链表我们需要根据后面的节点得到前面的节点,所以倒过来遍历不太现实. 我们可以将链表反转.这就是第一个点,.如何反转一个单链表.
二:反转的单链表是中间节点的右边部分,如果为偶数节点,中间节点就是中间左边那个,如果是奇数节点,那么中间节点就是中间那个.
如果得到中间节点是第二个问题?
三:现在有了两个单链表,如何去拼接这两个单链表呢?在不创建新的的链表的情况下,如何在原来的链表上面修改,这是第三个问题?
反转单链表是用到三个指针去迭代反转
找到中间节点用一个slow和fast指针.
原地合并链表还是有点需要去考虑的.
class Solution {
public void reorderList(ListNode head) {
if (head == null) {
return;
}
ListNode mid = middleNode(head);
//第一个节点
ListNode l1 = head;
ListNode l2 = mid.next;
mid.next = null;
l2 = reverseList(l2);
mergeList(l1, l2);
}
public ListNode middleNode(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public ListNode reverseList(ListNode head) {
//需要三个指针 会断掉键
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
public void mergeList(ListNode l1, ListNode l2) {
//1 2 3 4 5
//1 3 5
ListNode l1_tmp;
ListNode l2_tmp;
while (l1 != null && l2 != null) {
l1_tmp = l1.next;
l2_tmp = l2.next;
l1.next = l2; //
l1 = l1_tmp;
l2.next = l1;
l2 = l2_tmp;
}
}
}