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;
};