题目
思路
合并链表和数组有相似之处,都是每次将较小值加入新链表(新数组) ,我疑惑的是不知道怎么选第一个节点,看了题解发现可以使用一个头节点来解决这个问题。
代码
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;
}
}
题目
思路
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))这个真的很不错