解决方法
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
// 初始化:cur指向新链表的头结点, p1, p2分别指向链表l1, l2的头
// 1.两个节点l1, l2,如果p1指向的节点值小于等于p2指向的节点,则cur->next=p1;cur++;p1++; 否则,cur->next=p2;p2++;cur++;
// 2. 继续比较p1和p2, 若p1指向null,p2没有,则cur->next=p2;p2++;cur++;直到p2->null; 反之亦然
ListNode* res=new ListNode(-1); // 初始化,创建新的结果链表
ListNode* cur = res;
if (pHead1==nullptr && pHead2== nullptr)
return res->next;
// 都没到末尾,直接比较
while(pHead1!= nullptr && pHead2!= nullptr){
if (pHead1->val<=pHead2->val)
{
cur->next=pHead1;
cur = cur->next;
pHead1 = pHead1->next;
} else if (pHead2->val<pHead1->val)
{
cur->next = pHead2;
cur = cur->next;
pHead2 = pHead2->next;
}
}
//
if (pHead1== nullptr){
cur->next = pHead2;
} else {
cur->next = pHead1;
}
return res->next; // 结束,返回结果链表头指针
}
};
个人难点
- 第16、17行,创建链表的方法不熟,而且最终的返回值开始时不是结果链表的头指针,而实返回了最终位置指针
- 第35~39行,没有想到用直接连起来的方式,链表的优势没有充分发挥出来。标答中的一行写法也值得学习。