链表的合并
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
题解:
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
const mergeTwoList = (l1, l2) => {
const 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;
}
// 不等长情况
cur.next = l1 === null ? l2 : l1;
//返回非head头节点
return head.next;
}
规则:
本质,是处理链表结点之间的指针关系
链表节点的删除
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例:
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
题解:
/**
* @param {ListNode} head
* @return {ListNode}
*/
const deleteDuplicates = (head) => {
let cur = head;
while(cur && cur.next){
if(cur.val === cur.next.val){
cur.next = cur.next.next;
continue;
}
//否则移到下一位
cur = cur.next;
}
return head;
}
规则:
本质,是处理链表结点之间的指针关系
删除节点问题的延伸
给定一个排序链表,删除所有含有重复数字的结点,只保留原始链表中 没有重复出现的数字。
示例:
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
题解:
/**
* @param {ListNode} head
* @return {ListNode}
*/
const deleteDuplicates = (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){
cur = cur.next;
}else{
let val = cur.next.val;
// 删除后面重复的
while(cur.next && cur.next.val === val){
cur.next = cur.next.next;
}
}
}
return dummy.next;
}
规则:
创建前驱结点