从零学算法328
2023-12-21 16:35:54
328.给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
示例 1:
输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
示例 2:
输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]
- 我的原始人解法:那就定义两个链表一个存奇数节点一个存偶数节点,最后拼接起来即可。用两个节点不断遍历,初始化 a 为 head, b 为 head.next,然后不断让 a = b.next,b = a.next,a 结点就一直存放奇数节点,b 节点一直存放偶数节点
-
public ListNode oddEvenList(ListNode head) { if(head==null)return head; ListNode a = head, b = head.next; ListNode odd = new ListNode(0),even = new ListNode(0); ListNode curOdd = odd, curEven = even; while(a!=null || b!=null){ // 构建奇数链表 if(a!=null){ curOdd.next = new ListNode(a.val); curOdd = curOdd.next; } // 构建偶数链表 if(b!=null){ curEven.next = new ListNode(b.val); curEven = curEven.next; } // a 移动到下一个奇数节点 a=b!=null?b.next:null; // b 移动到下一个偶数节点 b=a!=null?a.next:null; } // 连接奇偶链表 curOdd.next = even.next; return odd.next; }
- 他人解法:思路类似,但是没必要再创建两个节点用来遍历,直接把原链表 head 以及 head.next 作为奇偶链表的头结点,然后构建的时候从这两个头开始遍历构建即可,
-
public ListNode oddEvenList(ListNode head) { if(head == null || head.next == null)return head; ListNode odd = head,even = head.next; ListNode curOdd = odd, curEven = even; // curEven == null 说明偶链表没法构建了 // curEven.next == null 其实就是 curOdd.next.next == null // 说明奇链表没法构建了 while(curEven != null && curEven.next != null){ // 构建奇链表 curOdd.next = curOdd.next.next; // 构建偶链表 curEven.next = curEven.next.next; curOdd = curOdd.next; curEven = curEven.next; } curOdd.next = even; return odd; }
文章来源:https://blog.csdn.net/m0_53256503/article/details/135132743
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!