1.原题
2.思路
- 定义一个虚拟头节点dummyHead,最后返回合并后的链表;
- 定义一个cur指针,用于调整链表的指向;
- list1 和 list2 不断更新,直到 list1 或者 list2 指向NULL;
一旦list1或list2有节点在合并后的链表中,list1和list2就往后移动。
- 循环终止的时候,list1 和 list2 至多有一个是非空的,并且两个链表都是有序的,只要将非空链表接在合并链表的最后即可。
1. 定义一个虚拟头节点dummyHead,最后返回合并后的链表;
初始状态:
2.对比list1 和 list2 所指向的值,数值相等所以选择将dummyHead指向list1(list2也可以),然后list1向后移动一位。
3.不断对比 list1 和 list2 所指向的值,直到list1 或者 list2 指向NULL
以此类推
3.整体代码
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode *dummyHead = new ListNode(0);
ListNode *cur = dummyHead;
/*list1和list2都不指向空的话,就继续执行以下代码,
也就是一旦list1 list2有一个指向NULL,就跳出循环。
两个链表都是有序的,只要将非空链表接在合并链表的最后即可。*/
while(list1 != NULL && list2 !=NULL)
{
if(list1->val < list2->val)
{
cur->next = list1;
list1 = list1->next;
}
else
{
cur->next = list2;
list2 = list2->next;
}
cur = cur->next;
}
if(list1 == NULL)
{
cur->next = list2;
return dummyHead->next;
}
else
{
cur->next = list1;
return dummyHead->next;
}
}
};