Problem
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入 | 输出 |
---|---|
1->2->4, 1->3->4 | 1->1->2->3->4->4 |
Solving
考虑用一个新的链表 l 来记录合并后的链表,用节点 t 记录链表的合并过程,节点 t 的初始化与节点 l 指向同一内存空间;当链表 l1 和 l2 非空时,依次按顺序遍历两个链表的节点值,较小的节点则连接在 t 节点的后面,直至任意一个链表为空。
此处节点 t 不断后移记录合并过程时节点 l 并不会随之后移,原因是初始化时节点 t 与节点 l 指向同一内存空间,当链表中的最小节点首次连接在节点 t 的后面时,也就同时连接在了节点 l 的后面,当节点 t 发生后移时,节点 l 仍然指向该内存空间并没有发生任何改变 。
注意:
- 当链表 l1 或 l2 为空时,直接将另外一个链表连接至节点 t 的后面即可;
- 此处用 new 函数为链表 l 动态申请了空间,因此在不再使用 l 时应释放申请的内存空间,否则会造成内存泄漏;并且要在在返回合并链表前进行内存释放,因为 return 语句代表当前函数的结束,其后的语句将不会执行,因此需要在内存释放前将合并后的结果链表保存一下。
Code(C++)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* l = new ListNode(0); //用new动态分配内存来存储合并的链表,val初始值为0;
ListNode* t = l; //节点t和节点l指向同一内存空间,节点t用来记录链表的合并过程;
while(l1 != NULL && l2 != NULL){ //分别比较两个链表的每一位数值,将小数值的节点接在l的后面;
if(l1 -> val <= l2 -> val){
t -> next = l1; //满足条件将l1接在t节点的后面;
t = t -> next; //t移动到后一个节点的位置;
l1 = l1 -> next; //l1移动到后一个节点的位置;
}
else{
t -> next = l2; //满足条件将l2接在t节点的后面;
t = t -> next;
l2 = l2 -> next;
}
}
if(l1 == NULL){ //当l1或者l2中有一个为空时将非空的链表接在节点t的后面;
t -> next = l2;
}
else{
t -> next = l1;
}
ListNode* mergedList = l -> next; //l节点后面的链表即为合并的结果链表,用mergedList记录;
delete l; //释放申请的内存空间;
return mergedList;
}
};
执行用时:8 ms
内存消耗:8.1 MB