(算法)链表的应用

57 阅读1分钟

链表的合并

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成的。

示例:

输入: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;
}

规则:

创建前驱结点