题目
思路
- 读题都读了好半天,一开始还以为是从第二个链表开始的反转链表。想不出来,润去题解。
- 解法一是存储,就是遍历链表,将节点值存入线性表中,然后使用双指针依次从头尾取元素。这个解法…比较暴力,感觉说出来会被人鄙视智商的那种,跳过。
- 将链表平均分成两半:前半部分和后半部分,然后将第二个链表进行逆序,再进行依次的连接。平均分成两半找中点的方法可以使用快慢指针,逆序可以使用反转链表,连接直接两个指针就好了。
代码
public static void reorderList(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast.next!=null && fast.next.next!=null){
slow = slow.next;
fast = fast.next;
fast = fast.next;
}
ListNode pre = null;
ListNode start = slow.next;
while(start!=null){
ListNode temp = start.next;
start.next = pre;
pre = start;
start = temp;
}
slow.next=null;
ListNode newHead = head;
ListNode zhizhen1 = head.next;
ListNode zhizhen2 = pre;
boolean flag=false;
while(zhizhen1!=null || zhizhen2!=null){
ListNode temp = null;
if(flag){
temp = zhizhen1.next;
newHead.next = zhizhen1;
newHead = newHead.next;
zhizhen1 = temp;
flag=false;
continue;
}
if(!flag){
temp = zhizhen2.next;
newHead.next = zhizhen2;
newHead = newHead.next;
zhizhen2 = temp;
flag=true;
}
}
}
双指针连接链表(记住)
ListNode newHead = pre;
slow.next = null;
while (newHead != null) {
ListNode temp = newHead.next;
newHead.next = head.next;
head.next = newHead;
head = newHead.next;
newHead = temp;
}