LeetCode 21

题目

 21. 合并两个有序链表

思路

合并链表和数组有相似之处,都是每次将较小值加入新链表(新数组) ,我疑惑的是不知道怎么选第一个节点,看了题解发现可以使用一个头节点来解决这个问题。

代码

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 使用头节点 简化判断
        ListNode head = new ListNode();
        // 指向新链表的最后一个节点
        ListNode cur = head;
        while(list1 != null || list2 != null){
            if(list1 != null && (list2 == null || list1.val <= list2.val)){
                cur.next = list1;
                list1  = list1.next;
            }
            else{
                cur.next = list2;
                list2 = list2.next;
            }
            cur = cur.next;
        }
        return head.next;
        
    }
}

题目

128. 最长连续序列 

思路

1)最开始想的是对他进行排序,然后从第一个元素开始判断,是否是连续的。但是也不知道怎么下手写,就去看了题解;

2)题解也很简单,就是将数组进行遍历一遍保存到set中,然后基于set.contains依次进行判断某个数的下一个数是否在数组中。有个小巧思:为了避免对最长子序列子序列的重复判断,先判断每个数字的前一个数字是否在数组中,如果在的话,说明该数字并不是子序列的起点。

代码

public int longestConsecutive(int[] nums) {
        // 使用哈希表对数组中的数进行存储
        HashSet<Integer> set = new HashSet<>();
        for(int num: nums){
            set.add(num);
        }
        int maxLen = 0;
        for(int num: nums){
            // 增加一个判断 如果当前数字的前一个数字也在集合中 即当前数字并不是最长序列的起点
            if(!set.contains(num - 1)){
                int tempNum = num;
            int tempLen = 1;
            while(set.contains(tempNum+1)){
                tempNum += 1;
                tempLen += 1;
            }
            maxLen = Math.max(maxLen, tempLen);
            }
            
        }
        return maxLen;

    }

Tips

if(!set.contains(num - 1))这个真的很不错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值