<题目表述>
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
<原题链接>
https://leetcode-cn.com/problems/merge-two-sorted-lists
<思路>
这里链表合并可以直接在原链表上修改即可,我们设三个变量*p, *q, *r以及存放最终结果的表头 *ans,其中p初始指向较小的第一个元素所在的链表,q指向另一个链表,r为游标,遍历两个链表。
当p处的值>=q处的值时,r指向q所在的链表,反之r指向p所在的链表。
当l1、l2其中一个链表遍历完成后,如果另外一个链表还有元素,那么将其直接接到r指针后面即可。
<样例代码>
#include<iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *p, *q, *r, *ans;
if (l1 == NULL) //注意这里,判断是否为空
return l2;
if (l2 == NULL)
return l1;
p = l1->val <= l2->val ? l1 : l2; //注意这里,将p设为开始较小的那个链表头。
q = l1->val <= l2->val ? l2 : l1;
ans = p; r = p; p = p->next;
while (p != nullptr && q != nullptr)
{
if (q->val <= p->val)
{
r->next = q;
r = q; //r指向q所在的链表
q = q->next;
}
else
{
r->next = p;
r = p; //r指向p所在的链表
p = p->next;
}
}
if (p != nullptr)
r->next = p;
if (q != nullptr)
r->next = q;
return ans;
}
};