题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
来源:力扣(LeetCode)
链接:力扣
解题思路:
概念理解:
链表:是一种物理存储上非连续的,数据元素的逻辑顺序通过链表的指针链接,而实现的线性存储结构。
特点:由一系列的节点组成,节点在运行时动态生成,每个节点包含两个部分:
数据域: 存储数据元素
指针域: 存储下一个节点地址
思路:
两个升序链表,要升序排列。先我们要考虑如何比较,这里,要满足升序排列,我们应该两两比较之后返回最小的排在前面,通过反复的两两比较,得到一条升序的链。
大概就是上面的1 与下面的1 比较 ,返回上面的1,生成节点1;
然后上面的1的链表.next再指向2, 2与下面的1比较,小的返回,生成节点1,然后下方.next,指向3
上方2与下方3比较,2小,生成节点2,上方.next ,再指向4,
自此往复。。。
但这里还要额外注意一点哦,当两条链,有一条已经走完了,而另一条还部位空,剩下部分要整体复制到新生成的链表里哦!!!
步骤:
- 创建节点
- while循环(这样才能循环往复的比较,直到有一个空了,才不用比较)
- while里的if()判断,升序返回小的,降序返回大的。生成新的节点,于此同时,移动链表
- 判断链表是否有剩余,剩余的整体复制到新生成的链表里
- 返回新的链表。(这里注意一个重点,dummy存储了该新的链表的头节点,而头部似乎是空的(这里我并不太确定),于是乎我们返回 dummy.next(虚拟头节点的节点,才是真正存了内容的东西))
代码:
var mergeTwoLists = function(list1, list2) {
let node = new ListNode();
// 创建节点
let dummy = node;
//不为空才能执行
while(list1 !== null && list2 !== null){
//升序!!找小的,先插入节点
if(list1.val < list2.val){
node.next = list1;
list1 = list1.next;
}else{
node.next = list2;
list2 = list2.next;
}
node = node.next;
}
if(list1 !== null){
node.next = list1;
}
if(list2 !== null){
node.next = list2;
}
return dummy.next
};
最后:
害,算法这东西真是令人头疼啊,等我更加深刻理解之后,我再来补充点别的吧,先就这样吧。
如果题目中,有什么不正确的地方,欢迎各位大佬们批评指正,希望大家都越来越好吧!!!