目录
力扣题目地址:
原题题目:
我们直接看题解吧:
解题方法:
审题目+事例+提示:
解题思路:
具体流程如下:
代码实现:
知识补充:
力扣题目地址:
21. 合并两个有序链表 - 力扣(LeetCode)
难度:简单
今天刷合并两个有序链表,大家有兴趣可以点上看看题目要求,试着做一下。
原题题目:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
我们直接看题解吧:
解题方法:
方法1、递归
方法2、迭代
审题目+事例+提示:
- 两个链表的节点数目范围是
[0, 50]
l1
和l2
均按 非递减顺序 排列
解题思路:
设L1,L2两个递增链表,合并成一个新的递增链表L3,
循环遍历依次比较两个链表的每一个节点,
若L1>L2,则L3的next指向L1,L1、L3下移一位,L1与L2继续比较,L2同理。
最后遍历结束,其中一个链表会剩下些节点,则直接加到L3即可
具体流程如下:
代码实现:
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
//虚节点的值为 0,它的值可以设置为任何的数,因为我们根本不需要使用它的值
ListNode dum = new ListNode(0), cur = dum;//创建一个虚头结点,同时cur指向dum
while (list1 != null && list2 != null) { //while循环结束条件为其中一个链表指向为空
if (list1.val < list2.val) { //当L1<L2,cur.next指向L1
cur.next = list1;
list1 = list1.next; //L1下移动一位
}
else {
cur.next = list2;
list2 = list2.next;
}
cur = cur.next; //cur下移动一位,比较其中一个链表下一位与另一列
//链表的当前位
}
//循环结束,判断L1是否指向为空,L1非空则cur.next指向L1,L2反之
cur.next = list1 != null ? list1 : list2;
return dum.next;
}
}
知识补充:
为什么要让cur=dum
链表头节点dum不能乱动,所以用cur暂代dum,让cur动,直接操作dum的话,最后返回就得重找头结点了
类似于浅拷贝后的对象和原对象的修改会相互影响,这本质是因为它们用的同一片内存,相当于一个房间配两把钥匙。但如果不是修改,而是直接赋值,它们是不会相互影响的,相当于换成了新房子的钥匙。