2021-07-04算法题

  1. 合并两个有序链表


    image.png

    思路:先创建一个头结点,然后同时遍历两个链表,将val小的不断插入到新的链表中。最后将没有遍历完的那个的链表直接链接到新链表的结尾即可。

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode first = new ListNode();
        ListNode index = new ListNode();
        index = first;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                index.next = l1;
                index = index.next;
                l1 = l1.next;
            } else {
                index.next = l2;
                index = index.next;
                l2 = l2.next;
            }
        }
        if (l1 == null) {
            index.next = l2;
        }
        if (l2 == null) {
            index.next = l1;
        }
        return first.next;
    }
}
  1. 删除有序数组中的重复项(*)


    image.png

    思路:
    需要借助双指针:一个指针slow表示不同的元素将要填充到的位置,另一个指针fast用于遍历获取不同元素的下标。
    fast和slow均从1开始。利用fast对数组遍历,当fast所指元素与前一个元素不同时,表明可以将fast所指元素插入到slow处;当fast所指元素与前一个相同时,fast就++

class Solution {
    public int removeDuplicates(int[] nums) {
        int slow = 1;
        int fast = 1;
        while (fast < nums.length) {
            if (nums[fast] != nums[fast - 1]) {//找到了不同的元素
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
}
  1. 移除元素


    image.png

    思路:循环,并用一个count记录目前等于val的数组元素的个数,每个元素都向前移动count个位置即可

class Solution {
    public int removeElement(int[] nums, int val) {
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == val) {
                count++;
            } else {
                nums[i - count] = nums[i];
            }
        }
        return nums.length - count;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容