算法刷题:链表的合并和删除

114 阅读1分钟

今天来看三道链表相关的基础题:

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;
}