算法题 week3

21 #合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

思路:设置一个新的链表,不断从l1和l2上找到较小的元素接在后面,生成新的有序链表。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode cur = dummyHead;
        while(l1 != null && l2 != null){
            if(l1.val<l2.val){
                cur.next = l1;
                cur = cur.next;
                l1 = l1.next;
            }
            else{
                cur.next = l2;
                cur = cur.next;
                l2 = l2.next;
            }
        }
        if(l1 == null){
            cur. next = l2;
        }
        else
            cur.next = l1;
        return dummyHead.next;
    }
    
}

py3代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        res = ListNode(None)
        node = res;
        while l1 and l2:
            if l1.val<l2.val:
                node.next,l1 = l1,l1.next
            else:
                node.next,l2 = l2,l2.next
            node = node.next
        if l1:
            node.next = l1
        else:
            node.next = l2
        return res.next

 

26# 删除排序数组中的重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

思路:快慢双指针,一个指向已经找到的不重复的数字的末尾,一个指向原数组,找到不同的放在慢指针处,找到相同的则快指针继续向后移动。

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums==null||nums.length==1){
            return nums.length;
        }
        else{
            int i = 0,j = 1;
            while(j<nums.length){
                if(nums[i]==nums[j]){
                    j++;
                }
                else{
                    i++;
                    nums[i] = nums[j];
                    j++;
                }
            }
            return i+1;
        }
    }
}

py3代码

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        flag = 0
        for num in nums:
            if nums[flag]!=num:
                flag+=1
                nums[flag]=num
        return len(nums) and flag+1

 

27#  移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路:快慢指针

class Solution {
    public int removeElement(int[] nums, int val) {
        if(nums == null||(nums.length==1&&nums[0]!=val))
            return nums.length;
        int j = 0;
        for(int i =0;i<nums.length;i++){
            if(nums[i]!=val){
                nums[j]=nums[i];
                j++;
            }
        }
        return j;   
    }
}

 py3代码

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        flag = 0
        for num in nums:
            if num != val:
                nums[flag]=num
                flag+=1
        return flag

 

posted @ 2019-09-29 21:54  小新要变成学霸  阅读(123)  评论(0编辑  收藏  举报