合并两个有序链表
题目
:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例1
:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例2
:
输入:l1 = [], l2 = []
输出:[]
示例3
:
输入:l1 = [], l2 = [0]
输出:[0]
C
法一:
思路
1.先判断两表是否为空
2.创建新表用于存储合并后的升序数据
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
//定义一个新表用来存储有序之后的数
struct ListNode *L = NULL, *r, *s ;
//判断两表是否为空
if(!list1){
return list2;
}
if(!list2){
return list1;
}
//循环当两表都存在时
while(list1 && list2){
//每次循环需要创建新的结点去存储数据
s = (struct ListNode *)malloc(sizeof(struct ListNode));
//判断两表的数值大小并存储到新表
if(list1->val <= list2->val){
s->val = list1->val;
list1 = list1->next;
}else{
s->val = list2->val;
list2 = list2->next;
}
//判断表是否为空
if(!L){
L = s;
}else{
//不为空
r->next = s;
}
r = s;
}
//将余下的表中的剩余元素并入新表
while(list1){
s = (struct ListNode *)malloc(sizeof(struct ListNode));
s->val = list1->val;
list1 = list1->next;
r->next = s;
r = s;
}
//
while(list2){
s = (struct ListNode *)malloc(sizeof(struct ListNode));
s->val = list2->val;
list2 = list2->next;
r->next = s;
r = s;
}
//表尾至空
r->next = NULL;
//返回表头
return L;
}
法二:
思路
不再创建新表,每次循环都要动态分配内存给结点,太过浪费内存。
只需要创建一个表头,将两表中符合条件的结点一次连接起来即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
//不创建新表,循环中每次都需要给结点动态分配内存,内存上的消耗过于大
//直接将两个表中复合条件的结点按顺序联系起来即可
//第一步还是判断两表是否为空
if(!list1){
return list2;
}
if(!list2){
return list1;
}
//创建一个空表头
struct ListNode *L = (struct ListNode *)malloc(sizeof(struct ListNode));
//p1指向List1 ,p2指向List2 ,s指向L->next
struct ListNode *p1, *p2 , *s;
p1 = list1;
p2 = list2;
s = L;
while(p1 && p2){
if(p1->val <= p2->val){
s->next = p1;
s = p1;
p1 = p1->next;
}else{
s->next = p2;
s = p2;
p2 = p2->next;
}
}
if(!p1){
s->next = p2;
}
if(!p2){
s->next = p1;
}
return L->next;
}
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) {
let p1 = list1
let p2 = list2
let newList = new ListNode(null)
let p3 = newList
if(!p1){
return p2
}
if(!p2){
return p1
}
while(p1 && p2){
if(p1.val <= p2.val){
p3.next = p1
p3 = p1
p1 = p1.next
}else{
p3.next = p2
p3 = p2
p2 = p2.next
}
}
while(p1){
p3.next = p1
p3 = p1
p1 = p1.next
}
while(p2){
p3.next = p2
p3 = p2
p2 = p2.next
}
//
return newList.next
};