今天来看三道链表相关的基础题:
1、链表的合并
题目:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成的。
示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
处理链表问题的本质:处理链表之间的指针关系。
const mergeTwoLists = function(l1,l2){
let head = new ListNode();
let cur = head;
while(l1 && l2){
if(l1.val <= l2.val){
cur.next = l1
l1 = l1.next
}else{
cur.next = l2
l2 = l2.next
}
cur = cur.next
}
// l1 l2不相等的情况
cur.next = l1!==null ? l1 : l2
return head.next
}
2、删除链表的重复元素I
题:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
const deleteDulicates = function(head){
let cur = head
while(cur!==null && cur.next!==null){
if(cur.val === cur.next.val){
cur.next = cur.next.next
}else{
cur = cur.next
}
}
return head;
}
3、删除链表的重复元素II
题:给定一个排序链表,删除所有含有重复数字的结点,只保留原始链表中 没有重复出现的数字。 该题中使用的设置虚拟结点的方式,对于解决链表一类的问题比较常用,需要留意。
const deleteDulicates = function(head){
//没有或者一个结点时
if(!head || !head.next){
return head
}
// 设置一个虚拟结点
let dummy = new ListNode();
dummy.next = head;
let cur = dummy;
// 两个或以上结点
while(cur.next && cur.next.next){
if(cur.next.val === cur.next.next.val){
let val = cur.next.val
// 继续排查后面还有没有重复的值
while(cur.next && cur.next.val === val){
// 删除相同的元素
cur.next = cur.next.next
}
}else{
cur = cur.next
}
}
return dummy.next;
}