算法:LeetCode328.奇偶链表

算法: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;

        }
        
    }
}

参考题解的方式,少定义了指针,代码更加简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值