题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
思路
链表的问题用while循环比较好,比较直观。用递归也是可以啊,不过感觉更难理解。
大神的演示
-
准备1:判空。这个判空很有意思,只要有一个为空,就直接返回另一个,都不需要合并。
-
准备2:引入3个可移动的辅助指针;传入参数list1和list2,以及合并后的链表头指针最好都不要修改。
-
步骤1:确定头指针;现在list1和list2都不为空了,谁的值小,谁就是合并后的头指针。
这步也容易忽略
-
步骤2:while循环,条件是两个链表都不为空,谁小,就把谁接上;然后指针逐步后移一位;
-
步骤3:退出while循环之后,有一个为空了,把剩下那个不为空的接上就完事了。
这步容易漏掉
- 步骤4:返回合并后的头指针,虽然这个指针基本啥也没干,就只是存了指针值。
C代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
// 判空
if (list1 == NULL) {
return list2;
}
if (list2 == NULL) {
return list1;
}
// 引入两个辅助指针,list1和list2保持不动
struct ListNode *current1 = list1;
struct ListNode *current2 = list2;
// 合并后的表头指针
struct ListNode *mergeList = NULL;
// 确定头指针,比较,谁小谁就是头
if (current1->val < current2->val) {
mergeList = current1;
current1 = current1->next;
} else {
mergeList = current2;
current2 = current2->next;
}
// 头指针保持不动,引入辅助进行移动操作
struct ListNode *mergeCurrent = mergeList;
// 两个链表不为空,才需要比较
while((current1 != NULL) && (current2 != NULL)) {
// 比较,谁小就接谁
if (current1->val < current2->val) {
mergeCurrent->next = current1;
current1 = current1->next;
} else {
mergeCurrent->next = current2;
current2 = current2->next;
}
// 往后挪一位
mergeCurrent = mergeCurrent->next;
}
// 接上剩余的
mergeCurrent->next = (current1 != NULL) ? current1 : current2;
// 返回合并后的指针
return mergeList;
}
JS代码
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function(list1, list2) {
// 判空
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
// 头节点
let current1 = list1;
let current2 = list2;
let mergeList = null;
if (list1.val < list2.val) {
mergeList = current1;
current1 = current1.next;
} else {
mergeList = current2;
current2 = current2.next;
}
// 比较大小,合并
let mergeCurrent = mergeList;
while((current1 != null) && (current2 != null)) {
if (current1.val < current2.val) {
mergeCurrent.next = current1;
current1 = current1.next;
} else {
mergeCurrent.next = current2;
current2 = current2.next;
}
mergeCurrent = mergeCurrent.next;
}
// 接上剩余的
mergeCurrent.next = (current1 != null) ? current1 : current2;
// 返回合并后的指针
return mergeList;
};
性能
![](https://img.haomeiwen.com/i1186939/ccf1754d4cea8619.png)
C比JS快很多啊
网友评论