# 中级算法 链表

# 两数相加

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

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

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

示例 1:



输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

TIP

思路就是逐位相加和进位

/**
 * 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}
 */

function add(val1, val2, carry) {
    let val = val1 + val2 + carry;
    if(val >=10) {
        return [val - 10, 1]
    }
    return [val, 0]
}

var addTwoNumbers = function(l1, l2) {
    let point1 = l1;
    let point2 = l2;
    let [val, carry] = add(point1.val , point2.val, 0)
    const node = {
        val: val,
        next: null
    }
    let curr = node;
    point1 = point1.next
    point2 = point2.next
    while(point1 || point2 || carry) {
        let [val, _carry] = add( point1 && point1.val || 0, point2 && point2.val || 0, carry)
        carry = _carry
        curr.next = {
            val: val,
            next: null
        }
        curr = curr.next;
        point1 && (point1 = point1.next)
        point2 && (point2 = point2.next)
    }
    return node
    
};

# 奇偶链表

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

示例 1:



输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var oddEvenList = function(head) {

};

# 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:



题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。