链表要从小到大排序,采用尾插法进行合并。
设置一个head指针,指向两个链表中第一个元素小的那个节点。然后设置一个p指针,来指向新链表的最后一个节点,比较两个链表的值的大小,链表1的p1节点值比链表2的p2节点值小,就将p1节点放在p节点后边,令p=p1。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* p1, * p2, * head, * p;
p1 = list1;
p2 = list2;
//判断特殊情况
if (list1 == NULL && list2 == NULL)
return NULL;
if (list1 == NULL && list2 != NULL)
return list2;
if (list1 != NULL && list2 == NULL)
return list1;
//找到第一个小的节点,令head=它
if (p1->val < p2->val) {
head = p1;
p1 = p1->next;
}
else {
head = p2;
p2 = p2->next;
}
p = head;
//遍历两个链表直到某一个链表变空
while (p1 != NULL && p2 != NULL) {
if (p1->val <= p2->val) {
p->next = p1;
p = p1;
p1 = p1->next;
}
else {
p->next = p2;
p = p2;
p2 = p2->next;
}
}
//如果一个链表空,另一个不空,就将不空的链表放在p节点后边
if (p1 != NULL) {
p->next = p1;
}
else {
p->next = p2;
}
return head;
}
};