算法:LeetCode328.奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/odd-even-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
方式一
/**
* 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 ListNode oddEvenList(ListNode head) {
if(head==null || head.next==null)
{
return head;
}else{
ListNode L1=head;
ListNode p1=L1;
ListNode L2=head.next;
ListNode p2=L2;
ListNode p=head.next.next;
while(p!=null){
p1.next=p;
p1=p;
p=p.next;
if(p!=null){
p2.next=p;
p2=p;
p=p.next;
}else{
p2.next=null;
break;
}
}
p1.next=L2;
return L1;
}
}
}
上述代码是通过将第一个节点当作奇链表的头节点,第二个节点作为偶链表的头节点,从第三个节点开始依次给奇偶链表增加节点,最后退出循环,奇链表的最后一个节点和偶链表头节点连接。
注意问题:
1、上述代码在测试的时候没错,提交时有的测试用例没有通过,说明部分情况没有考虑到,最开始的判断条件不仅仅需要判断head是否为空,第二个节点也应该判断,否则给p节点赋值就会产生空指针错。
2、按上述方式,处理最后一个结点时,要将next域设置为空,否则若结点是奇数,程序会陷入死循环。
方式二
* 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 ListNode oddEvenList(ListNode head) {
if(head==null || head.next==null)
{
return head;
}else{
ListNode p1=head;
ListNode L2=head.next;
ListNode p2=L2;
while(p1.next!=null && p2.next!=null){
p1.next=p2.next;
p1=p1.next;
p2.next=p1.next;
p2=p2.next;
}
p1.next=L2;
return head;
}
}
}
参考题解的方式,少定义了指针,代码更加简洁。