链表刷题总结(easy篇)

链表知识刷题总结(easy篇)

###1.返回链表的倒数第k个结点

###题目描述:

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

注意:本题相对原题稍作改动

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:

给定的 k 保证是有效的。

题解:

题解一:双指针

这题要求链表的倒数第k个节点,最简单的方式就是使用两个指针,第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指针即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution{
public int kthToLast(ListNode head, int k){
ListNode first = head;
ListNode second = head;

while(k-- >0){
first = first.next;
}
while(first!=null){
first = first.next;
second = second.next;
}
return second.val;
}

####题解二:使用栈求解(一看到倒数某某元素,要先想到栈)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution{
public int kthTolast(ListNode head , int k){
Stack<ListNode> stack = new stack<>();
//链表结点压栈处理
while(head!=null){
stack.push(head);
head = head.next;
}
//出栈串成新的链表
ListNode firstnode = stack.pop();
while(--k>0){
ListNode temp = stack.pop();
temp.next = firstNode; //这一步是不必要的,除非要求返回最后一个到倒数第k个结点链表,需要从新连接构建
firstNode = temp;
}
return firstnode.val;
}
}

2.删除中间结点

题目描述:

题解:

1

3.合并两个有序列表

题目描述:

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

示例 1:

image-20210120112941925

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:

输入:l1 = [], l2 = []
输出:[]
示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

题解:

题解一:递归

思路

我们可以如下递归地定义两个链表里的 merge 操作(忽略边界情况,比如空链表等):
image-20210120113648210

也就是说,两个链表头部值较小的一个节点与剩下元素的 merge 操作结果合并。

算法

我们直接将以上递归过程建模,同时需要考虑边界情况。

如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}

}
}

复杂度分析:

4.回文链表

####题目描述

题解:

#####题解一:将链表中的值复制到数组中在用双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution{
public boolean isPalindrome(ListNode head){
List<Interger> vals = new ArrayList<Integer>();

//将链表中的值赋值到数组中
ListNode currentNode = head;
while(currentNode != null){
vals.add(currentNode.val); //复制的是currentNode的值,而不是其本身
currentNode = currentNode.next;
}

//使用双指针判断回文
int front=0;
int back = vals.size()-1;
while(front<back){
if(!vals.get(front).equals(vals.get(back))){
return false;
}
front++;
back--;
}
return true;
}
}
复杂度分析:

image-20210120205633023

题解二:递归
1

谢谢你的支持哦,继续加油.