Leetcode 链表题目整合

Posted 开到荼蘼223's

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 链表题目整合相关的知识,希望对你有一定的参考价值。

leetcode-2 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

思路
对于两数相加的题目首先找出两个低位上的和,之后不断求高位上的和进行叠加,由于一个节点只可以存储一位数字,所以要设置进位,下面是具体代码执行:

/* *
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
    let addOne = 0; // 进位
    let head = new ListNode('0'); // 定义头节点
    let cur = head; // 定义当前节点
    while (l1 || l2 || addOne) {
        let val1 = l1 ? l1.val : 0;
        let val2 = l2 ? l2.val : 0;
        let sum = val1 + val2 + addOne;// 求和
        addOne = sum >= 10 ? 1 : 0;// 判断是否需要进位
        cur.next = new ListNode(sum % 10);
        cur = cur.next;
        if (l1) {
            l1 = l1.next;
        }
        if (l2) {
            l2 = l2.next;
        }
    }
    return head.next; //返回head.next原因是开始定义的head中保存着"0"
};

leecode-21 合并两个升序链表

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

思路
因为题目给出这两个链表都是有序的,并且要求返回的链表是一个升序的,这就思路很明确了,我们可以通过比较两条链表对应节点上的值进行判断新链表节点的顺序

当两条链表长度不同时,在循环终止的时候,l1 和 l2一个为空时,由于输入的两个链表都是有序的,直接把非空链表拼接在合并链表的后面,并返回合并链表即可,下面是具体代码执行:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function (l1, l2) {
    let head = new ListNode(0);// 定义头结点
    let cur = head;// 定义当前节点
    while(l1 && l2){// 当l1和l2都存在时执行下面逻辑
        if(l1.val <= l2.val){// 如果l1节点的值小于等于l2节点的值就让当前节点的下一个节点为l1当前节点
            cur.next = l1;
            l1 = l1.next;// l1指向下一个节点
            cur = cur.next;// 当前节点指向下一个节点
        }else{
            cur.next = l2;// 如果l1节点的值大于l2节点的值就让当前节点的下一个节点为l2当前节点
            l2 = l2.next;// l2指向下一个节点
            cur = cur.next;// 当前节点指向下一个节点
        }
    }
    // 当l1和l2中一个不存在时执行以下逻辑
    if(l1){
        cur.next = l1;
    }
    if(l2){
        cur.next = l2;
    }
    return head.next;
};

剑指offer-24 翻转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

思路
翻转链表可以通过在遍历链表时,将当前节点的next指针改为指向前一个节点,但这样当前节点的与后一个节点的next指针就断了就到不了后一个节点了,所以应该创建一个临时的指针变量next让当前节点可以不断向后移位,
下面是具体代码执行:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    let cur = head;// 设置当前节点
    let prev = null;// 设置前一个节点
    while(cur){
        let next = cur.next;// 创建临时节点可以让cur当前节点可以向后移位
        cur.next = prev;// 当前节点的next指针改为prev
        prev = cur;// 前一个节点指针向前移一位
        cur = next;// 当前节点向后移一位
    }
    return prev;
};

以上是关于Leetcode 链表题目整合的主要内容,如果未能解决你的问题,请参考以下文章

817. Linked List Components - LeetCode

Leetcode题解 - 链表简单部分题目代码+思路(21832032062419876)

[算法] leetcode单链表相关题目详解

leetcode剑指offer合集+题解

leetcode剑指offer合集+题解

leetCode第21题——合并两个有序链表