01链表回文 02链表反向相加

1.简单一道

编写一个函数,检查输入的链表是否是回文的。

示例 1:

输入: 1->2
输出: false 

示例 2:

输入: 1->2->2->1
输出: true

链表的形式,我们可以直接将其转化为数组,采用while循环,head链表形式,将其值插入到数组中去,最后由数组转化为字符串,利用字符串的翻转来实现这一方式。
使用IPO方式:
I:输入一个链表
P:
(1)将链表转为数组形式
(2)将数组转为字符串形式
(3)利用数组的翻转函数reverse()转为翻转数组,再转为字符串对比
O:输出一个判断真假的布尔值

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var isPalindrome = function(head) {
    let arr=[]
    while(head){
        arr.push(head.val)
        head=head.next
    }
    return arr.join('')==arr.reverse().join('');
};

也可以采用链表的翻转,将链表进行翻转,然后逐一比较

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var isPalindrome = function(head) {
  let foot = reverse(head)
  while(head){
    if(head.val !== foot.val) return false
    head = head.next
    foot = foot.next
  }
  return true
};
// 翻转链表
function reverse(head){
  let listed = head
  let res = null
  while(listed){
    let cur = new ListNode(listed.val)
    cur.next = res
    res = cur
    listed = listed.next
  }
  return res
}


2.中等一道

给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。

示例:

输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:假设这些数位是正向存放的,请再做一遍。

示例:

输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912

I :两个链表
P:计算两个链表的和的值
(1)采用进位的方式 第一个数相加产生进位,添加链表结点,值为取模10的结果
(2)第二个数相加的时候,将原来的进位也一并相加,然后添加链表结点
(3)以此类推,结束条件为链表结束并且不产生进位
O:返回值为一个链表

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
    //carry表示进位
    let carry=0,root=new ListNode(null)
    let p=root
    while(true){
        let val=(l1?l1.val:0)+(l2?l2.val:0)+carry
        //进位
        carry=Math.floor(val/10)
        //这一位上的值
        val=val%10
        // 新结点赋值
        p.next=new ListNode(val)
        p=p.next
        // l1l2链表是否为空
        if(l1) l1=l1.next;
        if(l2) l2=l2.next;
        // 进位为0的时候退出
        if(!l1 && !l2 && !carry)
            break;      
    }
         return root.next;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值