题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题思路
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
- 创建一个新链表,循环比较两个原链表的值,每次将较小的值插入到新链表中,最后再将某个链表中剩余的部分整个插入到新链表中,这个方法好想,但是实现起来稍微有点复杂,这里就不贴代码了,我主要解释下第二种我认为更为简单的做法
- 将L1作为返回的新链表,与L2中的元素挨个比较,如果比L2中的大,则将L2的元素插到L1的前面,L2向后走;如果比L2中的小,则L1往后遍历,直到比L2的大,将L2的元素插到L1的前面,如果L1遍历到末尾而L2还有剩余,则此时L1中的元素肯定都小于L2中的元素,把L2的剩余部分整个拼接过来;如果L2到了末尾,则两个链表已经合并完成
- 只是一个解题思路,不过这方法写起来简单,但是复杂度高,就是先遍历一个链表找到尾节点,然后将另一个链表整体插入过来,变成一个新的链表,再进行排序。
第二个方法的注意点:L1往后遍历时,要记得用一个指针保存当前节点的前一个节点,为了能往当前节点插入到L1指向节点的前面
代码演示
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL) return pHead2;
else if(pHead2 == NULL) return pHead1;
ListNode* cur1 = pHead1;//cur1遍历L1
ListNode* cur2 = pHead2;//cur2遍历L2
ListNode* next = NULL;//用来保存L2遍历结果的下一节点,插入后cur2要能指回来
ListNode* prev = cur1;
while(cur1 != NULL && cur2 != NULL)
{
if(cur1->val <= cur2->val)
{
prev = cur1;//保存cur1的前一节点,为了能在cur1前插入新节点
cur1 = cur1->next;//cur1往后遍历
continue;
}
//往cur1前插入节点
next = cur2->next;
prev->next = cur2;
cur2->next = cur1;
cur2 = next;
}
//cur1遍历到L1的末尾,此时prev正指向L1的最后一个节点,将L2剩余部分整个拼接过来
prev->next = cur2;
return pHead1;
}
};