NowCoderTOP12-16——持续更新ing

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NowCoderTOP12-16——持续更新ing相关的知识,希望对你有一定的参考价值。

TOP12. 单链表的排序

public class Solution 
    /**
     * @param head ListNode类 the head node
     * @return ListNode类
     */
    public ListNode sortInList (ListNode head) 
        // 法二: 转化为数组排序
        ArrayList<Integer> nums = new ArrayList();
        ListNode node = head;
        // 遍历链表,将节点值加入数组
        while(node != null) 
            nums.add(node.val);
            node = node.next;
        
        node = head;
        // 对数组排序
        Collections.sort(nums);
        // 遍历数组
        for(int i = 0; i < nums.size() ; i++) 
            // 将数组元素依次插入链表
            node.val = nums.get(i);
            node = node.next;
        
        return head;
        
        // 法一: 归并排序
//         //链表为空或者只有一个元素,直接就是有序的
//         if(head == null || head.next == null) return head;
//         // 定义三个指针,快指针 fast 一次走两步,
//         // 慢指针 mid 一次走一步,
//         // 前驱指针 left 在慢指针前一个元素节点
//         ListNode fast = head.next.next;
//         ListNode mid = head.next;
//         ListNode left = head;
//         while(fast != null && fast.next != null) 
//             fast = fast.next.next;
//             mid = mid.next;
//             left = left.next;
//         
//         left.next = null;
//         return Merge(sortInList(head),sortInList(mid));
//     
    
//     // 合并两段有序链表
//     public ListNode Merge(ListNode head1,ListNode head2) 
//         // 边界条件,一个为空,返回另一个
//         if(head1 == null) return head2;
//         if(head2 == null) return head1;
//         // 添加表头
//         ListNode dummyHead = new ListNode(0);
//         ListNode cur = dummyHead;
//         // 两个链表都不为空,才可以进行元素的插入
//         while(head1 != null && head2 != null) 
//             if(head1.val <= head2.val) 
//                 cur.next = head1;
//                 head1 = head1.next;
//             else 
//                 cur.next = head2;
//                 head2 = head2.next;
//             
//             cur = cur.next;
//         
//         // 若两个链表长度不等,此时可能存在某一个链表为空的情况
//         if(head1 == null) cur.next = head2;
//         else cur.next = head1;
//         return dummyHead.next;
    

TOP13. 判断一个链表是否为回文结构

public class Solution 
    /**
     * @param head ListNode类 the head
     * @return bool布尔型
     */
    public boolean isPail (ListNode head) 
        // 如果只有一个节点,返回 true
        if(head.next == null) 
            return true;
        
        List<Integer> nums = new ArrayList<Integer>();
        // 将链表转化为 list
        while(head != null) 
            nums.add(head.val);
            head = head.next;
        
        // 链表转化为 list 了
        int i = 0;
        int j = nums.size() - 1;
        while(i < j) 
            // 从前向后遍历,从后向前遍历,比较各个元素值是否相等
            if(!nums.get(i).equals(nums.get(j))) return false;
            ++i;
            --j;
        
        return true;
    

TOP14. 链表的奇偶重排

public class Solution 
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode oddEvenList (ListNode head) 
        if(head == null || head.next == null) return head;
        // 偶节点
        ListNode even = head.next;
        // 奇节点
        ListNode odd = head;
        ListNode evenHead = even;
        while(even != null && even.next != null) 
            odd.next = even.next;
            odd = odd.next;
            
            even.next = odd.next;
            even = even.next;
        
        odd.next = evenHead;
        return head;
    

TOP15. 删除有序链表中重复的元素-I

public class Solution 
    /**
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) 
        if(head == null || head.next == null) return head;
        ListNode cur = head;
        while(cur.next != null) 
            if(cur.val == cur.next.val) 
                cur.next = cur.next.next;
            else 
                cur = cur.next; 
            
        
        return head;
    

TOP16. 删除有序链表中所有重复的元素-II

public class Solution 
    /**
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) 
        if(head == null || head.next == null) return head;
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        ListNode cur = dummyHead;
        while(cur.next != null && cur.next.next != null) 
            if(cur.next.val == cur.next.next.val) 
                int temp = cur.next.val;
                while(cur.next != null && cur.next.val == temp) 
                    cur.next = cur.next.next;
                
            else 
                cur = cur.next;
            
        
        return dummyHead.next;
    


以上是关于NowCoderTOP12-16——持续更新ing的主要内容,如果未能解决你的问题,请参考以下文章

NowCoderTOP28-34二叉树——持续更新ing

NowCoderTOP28-34二叉树——持续更新ing

NowCoderTOP23-27——持续更新ing

NowCoderTOP17-22 二分查找/排序——持续更新ing

NowCoderTOP17-22 二分查找/排序——持续更新ing

NowCoderTOP23-27二叉树遍历——持续更新ing