一、题目形貌
题目链接: . - 力扣(LeetCode)
二、解题思绪
- 找到链表的中心节点,将链表分为两部分(可使用快慢双指针)
- 将后半部分链表逆序(双指针或头插法)
- 合并两个链表
一定要留意给分开之后的两个链表的末尾节点 .next 置为 null,否则会出错(超出时间限制)!
三、代码
- class Solution {
- public void reorderList(ListNode head) {
- if(head == null || head.next == null || head.next.next == null) {
- return;
- }
- //1、找到链表的中间节点
- ListNode slow = head, fast = head;
- while(fast != null && fast.next != null) {
- slow = slow.next;
- fast = fast.next.next;
- }
- //此时slow所指即为中间节点
- //将原始链表分为两个链表,要注意给分开之后的两个链表的末尾节点.next置为空
- //2、逆序slow之后的部分(双指针)
- ListNode prev = slow.next;
- slow.next = null;
- ListNode cur = prev.next;
- prev.next = null;
- while(cur != null) {
- ListNode next = cur.next;
- cur.next = prev;
- prev = cur;
- cur = next;
- }
- //逆序之后,prev指向逆序后链表的首节点
- //3、合并两个链表
- ListNode cur1 = head, cur2 = prev;
- ListNode ret = new ListNode(0);
- ListNode ccur = ret;
- while(cur1 != null) {
- ccur.next = cur1;
- ccur = cur1;
- cur1 = cur1.next;
- if(cur2 != null) {
- ccur.next = cur2;
- ccur = cur2;
- cur2 = cur2.next;
- }
- }
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |