1.合并两个有序链表

解法
1.循环+双指针
首先新建一个空结点resultNode,然后让p指向resultNode
使用双指针每次比对两链表的两个结点,首先判断两链表其中一个链表是否为空,如果为空就跳出循环。接下来如果list1.val < list2.val,那么p.next = list1且list1就顺移到下一个结点即list1 = list1.next,同理list1.val >= list2.val的情况也是如此。
直到有某一链表被循环完毕了,则跳出循环进行判断。如果list1为空了,那么p.next = list2 ,因为list2本就是有序的。所以可以直接将list2的所有结点连接在p后面;同理list2为空也是这样的逻辑。
最后只需要将resultNode.next返回即可,因为resultNode的头结点是我自定义为0不需要带着返回
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function(list1, list2) {
let resultNode = new ListNode(0, null)
let p = resultNode
if(list1 == null) return list2
if(list2 == null) return list1
while(list1 != null && list2 != null) {
if(list1.val < list2.val) {
p.next = list1
list1 = list1.next
} else {
p.next = list2
list2 = list2.next
}
p = p.next
}
if(list1 == null) {
p.next = list2
}
if(list2 == null) {
p.next = list1
}
return resultNode.next
};
其中的关键点就是,我认为resultNode是一个完整的链表,而p只是该链表中的某一个结点,所以不可以省略以下这一步,如果最后返回p或者p.next的话得到的只是一个结点而非链表。
let resultNode = new ListNode(0, null)
let p = resultNode
2.递归
var mergeTwoLists = function(list1, list2) {
if(list1 == null) return list2
if(list2 == null) return list1
if(list1.val < list2.val) {
list1.next = mergeTwoLists(list1.next,list2)
return list1
} else {
list2.next = mergeTwoLists(list1,list2.next)
return list2
}
};
2.删除排序链表中的重复元素

解法
1.普通解法
判断下一个结点是否为空,如果不为空的话,那么就比较当前结点和下一个结点的值;如果这两者相等的话就将currentNode.next.next赋给currentNode.next将该重复元素覆盖掉,反之就将当前结点变为下一结点。
var deleteDuplicates = function(head) {
//空链表
if(head == null) {
return head
}
//这里一定要注意,currentNode最终只是结点,只有head才是完整的链表
let currentNode = head
//只有下一结点不为空才可以进入循环
while(currentNode.next != null) {
if(currentNode.val == currentNode.next.val) {
currentNode.next = currentNode.next.next
} else {
currentNode = currentNode.next
}
}
return head
};