原题目
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
中文大意
对两个有序的链表进行合并,返回一个新的链表。这个新的链表应该是能够通过旧链表节点的重新连接而产生的。
题解
/**
* 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* merge = new ListNode(-1);
ListNode* ans = merge;
//每次找到两个链表当前节点中较小的一个,加到merge链表中
while(l1!=NULL&&l2!=NULL)
{
if(l1->val > l2->val)
{
ListNode* currNode = new ListNode(l2->val);
merge ->next = currNode;
merge = merge->next;
l2 = l2->next;
}
else
{
ListNode* currNode = new ListNode(l1->val);
merge ->next = currNode;
merge = merge->next;
l1 = l1->next;
}
}
//处理两个链表长度不一致的情况
while(l1!=NULL)
{
ListNode* currNode = new ListNode(l1->val);
merge ->next = currNode;
merge = merge->next;
l1 = l1->next;
}
while(l2!=NULL)
{
ListNode* currNode = new ListNode(l2->val);
merge ->next = currNode;
merge = merge->next;
l2 = l2->next;
}
ListNode* temp = ans;
ans = ans->next;
delete temp; //防止内存碎片产生
return ans;
}
};
思路
- 我做这道题的目的是为链表归并排序做铺垫,也是对数据结构基础的复习。实质上,无论要合并的两个链表是否已经有序,不妨碍这个算法本身的执行,以为都是直接遍历两个链表然后取出较小的一个插入到新的链表当中,无需新建节点。因此,算法的时间复杂度为O(n+m),空间复杂度为O(1)
- 在实现的过程中还要注意一点是两个链表不等长的时候,需要对单个的链表再进行处理,这个时候必然有一个链表为空,只要将非空链表的剩余节点,加到新链表的末尾就行了
- 此外,要注意的是,在合并两个链表的时候,我新建了一个节点,作为链表的头部。但当归并的过程结束以后,需要将这个头部删除,防止内存碎片的产生