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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值